为什么使用Event Sourcing?

Event Sourcing并不是存储状态,所有应用状态是代表事实的原始证据,它完全打开了我们应用的全新架构。

Why use Event Sourcing - Arkency Blog

有许多理由使用Event Sourcing,当你浏览Greg Young的系列文章和谈话你会发现下面要点:
1. 它不是一个新概念,真实世界中许多领域都很像它,看看你的银行账户状态,比如储蓄卡,它打印出一笔笔进出明细和当前余额,这一笔笔代表了领域事件。

2.通过重播事件,我们能够得到对象的任何时刻状态(这里应该用正确术语:聚合aggregate),比如储蓄卡每笔记录的当前余额代表你这个账户聚合对象的某刻时刻的状态,这可能会极大地帮助我们理解领域知识,当前状态是怎么来,因为什么改变?方便调试关键问题的错误。

3.领域中当前状态和存储数据库中的数据没有任何耦合,而传统上我们都是将应用状态存储到数据库中,比如储蓄卡当前余额100元存储到数据库中,现在我们存储导致余额的进出事件了,存款了多少钱,取款了多少钱,这一笔笔领域事件都会记录在数据库中。

4.Append-only追加模型存储这些事件,易于扩展,这样我们无论读写都有很好地性能,读取能够转为查询优化,也可以转为写优化(因为没有读,写得很快),读写分离。

5.除了可以存储用户意图数据,也就是操作事件,事件存储顺序能够用来分析用户正在做什么,通往大数据。

6.我们能避免了对象与关系数据库的不匹配。

7.审计日志是免费的,一次审计日志所有变化,因为没有状态改变,只有事件。

Greg Young说:这个星球上最烂的就是每个数据库,它们都以自己独特的方式自淫。

参考:Linked使用Apache Samza对数据库进行彻底的"调教"

关于ES实现如何分布式事务的问题,这个话题是个人为的坚深问题,保守的人与激进的人总是有争执,如同锁有保守锁和乐观锁一样。

一定请注意,事件流本身已经保证了跟随时间变化而保持一定逻辑顺序的一种流,如同我们观看网络电视,永远不会担心我们会首先看到影片结尾,然后才看到影片开头,这种混乱理论上可能,实际上很少情况发生,为极端情况付出的成本也是高昂的。

事件流是所有事实的一手证据,打比喻说:如同能够判定嫌疑犯为罪犯的直接证据,最直接最原始最显然的证据,只要这个根源中事件顺序不会乱,保持一定的次序(当然也可能事件同时发生,这也有算法可解决),我们还是可以通过时钟将事件流中的这种逻辑一致性分发到分布式各个节点上,如同我们电视直播,无论多少人观看,我们都能保持成千上万客户端观看直播的顺序,差别只不过有的跟得紧一些,有的延迟大一点,滞后一点一样,如同我们在晚上7点打开电视,发现所有频道都在播放新闻联播一样,在不同台之间切换只不过有点延迟而已。

提供参考:
线性化与串行化比较

When Does Consistency Require Coordination?

PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式

[该贴被banq于2015-03-21 16:26修改过]