Cqrs
- 23. CQRS – Command Side性能
聚合根In-Memory,避免每次操作聚合根时
要用ES还原聚合根
路由Command,确保对聚合根的修改无并
发
需要高性能分布式队列
需要高性能的Event Store, Command Store
需要将生命周期已结束的聚合根从内存移除
Group Commit Domain Events
- 26. CQRS – Command Store设计
Command Store的主要目的用于对Command的存储及幂等检测
可以用key/value的NoSQL来存储,也可以用关系型DB
根据CommandId来sharding,实现水平拆分、扩容
- 27. CQRS – Event Store设计
通过AggregateRootId + Version的唯一索引,检测并发冲突
AggregateRootTypeCode实现垂直拆分,AggregateRootId实现水平拆分
Sequence,自增字段,用于动态扩容时为迁移数据提供帮助
也可以用key/value的NoSQL来存储,key为aggId+version的组合
- 28. CQRS – Query Side 数据一致性问题
关键问题:必须确保C端的事件的存储的顺序与
Q端事件响应的顺序相同
例子:
C端的事件保存顺序:+1,*2,-1 => 1
Q端的事件响应顺序:+1,-1,*2 => 0
- 29. CQRS – Query Side 数据一致性解决
框架在收到Event后,判断当前聚合根已经响应的事件的version,如果为10,则下
一个只能响应version=11的事件,其他后续的事件都只能等待。
框架在调用每一个Event Handler时,判断该事件是否被该Handler处理过。
- 30. CQRS – Query Side 存储与性能
用关系型数据存储查询数据
按照第三范式设计表结构
尽可能减少并发冲突,框架会做最大限度的并发
控制,但还需要开发人员配合做好并发控制
通过消息队列异步更新统计信息
单个Master DB多个Slave DB的方式
Master DB根据Domain Event更新
所有查询面向Slave DB
设计其他的NoSQL,提供更多的查询支持,
NoSQL也根据Domain Event更新