dcddc

西米大人的博客

0%

系统学习CQRS和EventSourcing

Event Sourcing

概括来说,Event Sourcing有别于CRUD直接操作数据源(DDD中称为聚合根或实例),只记录数据的状态变化(state event),通过replay这些event可以得到最终的数据状态视图。它的优点是Complete Rebuild(重新生成状态视图), Temporal Query(查询历史视图,类似Git查看某个版本数据视图), Event Replay(新模块可重放event满足自身需求)。在event积累太多的情况下,从头开始replay的耗时将难以接受,可以在某个event发生的时候,将这个聚合对象的最新数据状态,写到一个表中,这个表可以叫做物化视图。在查询的时候,可以通过该物化视图去查询,而不用从头开始replay

它的一些优点:

  • 方便进行溯源与历史重现
  • 性能
    • 在Event Sourcing模式下,事件数据的保存是一个一直新增的写表操作,没有更新。这在很多情况下都能够提供一个非常好的写的性能,让系统的接收事件的吞吐量可以很高。
  • 方便数据分析
    • 用了Event Sourcing模式,我们的数据就是事件,我们只需要在的事件监听方法里增加数据分析能力;或者将event直接发送到数据分析系统

CQRS

CQRS,是 Command Query Responsibility Segregation的缩写,也就是通常所说的读写隔离。CQRS的想法很朴素,在CRUD模式read/write都是操作同一个数据源,CQRS把write的数据源和read的数据源分开。通过Command模块写到write库,write库的数据异步同步到read库,以供Query模块查询数据。CQRS的优点是数据库分离成了read库和write库,这样他们就可以各自scale了,不存在相互拖累的情况。分离之后,我们可以自行选择更适合的方案实现read库和write库,比如Apache Cassandra实现write库,Elasticsearch实现读库。

Event Sourcing + CQRS

Event Sourcing模式中,为了性能考虑,数据写入时只记录数据的状态变化,由另一个事件监听器异步处理,将聚合根的数据状态用物化视图的形式保存,可以用于数据的查询操作。也就是说,Event Sourcing自身就要求数据的更新与查询的流程隔离开来,通过事件来更新聚合根的数据状态,同时由另一个监听器处理相同的事件,来更新物化视图的数据。所以,Event Sourcing与CQRS有着天然的联系