AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
87 stars 11 forks source link

CQRS以及Event Sourcing #84

Open AlexiaChen opened 4 years ago

AlexiaChen commented 4 years ago

CQRS的概念来自于领域驱动设计(DDD),就是命令与查询职责分离,相当于根据领域模型进行更高一层次的读写分离。一般读写两端的数据库在物理上是分割的。写端就是commands端,读端其实就是query端,这样做能最大化性能和提高系统的可伸缩性,更加灵活,如果CQRS模式结合Event sourcing模式实现复杂度也会更高,至今还没有一个成熟的框架。如果要实现,比较考验架构师的能力,因为要从CQRS的概念出发,实现基本的底层特性。

当然,读写两端的存储层就不用自己动手写了,一般用成熟的数据库,比如写端可以是MySQL或者PostgreSQL,读端可以是MongoDB或者PostgreSL(PG支持materialized views)。 当然,按理来说写端和读端的数据库是不一样的。但据知乎上更专业的人士评价,PostgreSQL作为号称全世界最先进的数据库,一个牛逼之处就是,几乎可以通吃主流场景(OLAP,OLTP),而且都能达到不错的规模,这是相当不得了,或许读写两端都可以用PostgreSQL了?https://github.com/tobyhede/postgresql-event-sourcing/ https://medium.com/@tobyhede/event-sourcing-with-postgresql-28c5e8f211a2 https://github.com/commanded/eventstore 看以上几个链接,看来PG通吃读写两端了。

CQRS配合Event sourcing的基本实现原理如下:

另外提一些细节:因为事件序列(Event sequence)是有顺序的,与UTXO模型很像,类似区块链里面的交易(Transaction)链,顺序一旦搞乱了,重放事件序列会有错误,所以每个事件有自己的ID和时间戳,Event ID需要关联到一个数据实体上,也就是说,该事件是对哪一个数据实体做的变更记录。也可以通过实体ID拿到关于它的事件序列,通过事件序列来重放(恢复)它的当前状态。

当然,还有更多的细节,可以看以下参考资料,或者结合自己的架构,工程经验来实现了,目前应该没啥捷径可走。

参考资料