.NET的EventStore事件存储数据库

13-09-18 banq
EventStore/EventStore · GitHub是一款面向.NET的Event Store数据库,这是面向CQRS + Event Sourcing架构下用来记录Domain Events的数据库,相关概念见:https://github.com/eventstore/eventstore/wiki/Event-Sourcing-Basics

Event Store 作为一个 functional database,可以进行事件的回放重播,当我们“重播”一个事件流,我们返回的是一系列的事件。一个事件本质上是一个序列化方法调用,通过重新调用这些方法返回当前状态,可以使用如下代码表达:

when([SomePatternMatch], function(state, event) { return new state; });

事件流导致这些函数调用被串联成链,每个函数有一个状态结果,上一个函数处理的状态传导到下一个函数. 换句话说,当前状态是一个先前事实的left fold. 我们可以更远地说这是一个snapshot,快照其实就是left fold备份记忆. 当从这个角度看,Event Store 其实是 functional database.函数数据库。

[该贴被admin于2013-10-11 16:47修改过]

1
BrightSpring
2013-10-09 23:32
函数式编程下,回放肯定不难的,感觉函数式,DDD,并行分布式都会一起普及

[该贴被BrightSpring于2013-10-09 23:32修改过]

[该贴被BrightSpring于2013-10-09 23:36修改过]

daxnet
2013-10-10 17:11
貌似现在DDD的思想还是很难被国内接受并实践

tangxuehua
2013-10-10 18:25
当事件非常多时,一次完整重放的代价是很大的,因为事件的量是非常庞大的。domain in-memory如果挂掉了,然后重启的时候,如果能够自己恢复一部分数据,然后再只要从eventstore取出一部分事件,然后通过重放来恢复整个domain in-memory,这样效率高,服务器恢复时间也短。

而且就算重放的速度很快,几百G,上T的东西要恢复到内存,那也至少得按小时算吧,那难道机器就要等这几个小时才能继续为用户服务?所以,系统的可靠性肯定是要通过replication来解决的。一台挂了,还有另一台顶上来。然后另一台顶上来后,挂了的这台我们才可以慢慢重启,慢慢通过event sourcing恢复数据好了。

我觉得eventstore更大的用处不是用来恢复整个domain,而是在遇到线上问题时,能够根据线上的事件,取出相关的事件,然后在测试环境重放,以找出问题所在,这个价值我觉得更大,呵呵。

[该贴被tangxuehua于2013-10-10 18:29修改过]

aixs
2013-10-23 09:03
2013-10-10 18:25 "@tangxuehua"的内容
我觉得eventstore更大的用处不是用来恢复整个domain,而是在遇到线上问题时,能够根据线上的事件,取出相关的事件,然后在测试环境重放,以找出问题所在,这个价值我觉得更大,呵呵。 ...

我个人并不认同es用来找问题的价值更大。es只是对系统运行的一些客观记录,换句话说就算能找出系统运行到哪一步出现了错误,也不能去擅自修改es中的记录。排错主要采取的是日志等方式

tangxuehua
2013-10-23 09:14
2013-10-23 09:03 "@aixs"的内容
我个人并不认同es用来找问题的价值更大。es只是对系统运行的一些客观记录,换句话说就算能找出系统运行到哪一步出现了错误,也不能去擅自修改es中的记录。排错主要采取的是日志等方式 ...

相对日志来说,event描述了整个数据的变化过程。没有比event更详细的东西了。当然,以前没有event的时候,只能通过log排错;但有时通过log是不够的,那通过event就能帮大忙了。

相比用es来还原整个系统的作用,我的主要疑惑是,如果in memory domain真的挂了,那通过es还原系统会很久,而用户等不了这么久,所以我觉得这点来看es的意义不是很大。

w438418754
2013-10-23 17:16
lmax上面有提到过这个问题,其实这个就是故障转移的处理,

tangxuehua
2013-10-23 20:55
2013-10-23 17:16 "@w438418754"的内容
lmax上面有提到过这个问题,其实这个就是故障转移的处理, ...

LMAX就是用了master-slave模式,master挂了后,以微秒级别的速度切换到slave上,然后slave马上接手处理。

w438418754
2013-10-24 10:38
那不就是了,他们的in memory domain 是放在应用服务器上的,主应用服务器取出队列的命令后同步发送给从应用服务器(通过广播)所以如果主服务器挂了(也就是主服务器的in memory domain挂了)直接切换的从服务器.

tangxuehua
2013-10-24 21:09
恩,所以确保系统一直可用是通过replication来保证的,而用event sourcing无法做到永不挂机。

猜你喜欢