Skip to content
anruence edited this page Aug 24, 2022 · 12 revisions

Welcome to the enode wiki!

enode中有很多概念,信息密度比较高,上手的难度相应的也比较大,为了让开发人员更好的用起来,会把一些常见的概念和设计思路记录在此

核心概念

消息

命令消息

  • Command是命令,是想法,意图,描述你想做什么,要注意不是行为,因为还没发生

事件消息

  • Event是想法实施后,引起了聚合根状态变化而产生出了事件(带有业务语义)

EventStore

  • 存储聚合根产出的事件的地方,根据事件恢复聚合根的操作叫做EventSourcing

隐性约定解读

一个命令一次只能修改一个聚合根

首先做这个限制是从业务研发的角度来考虑的,这会让命令的职责更加具体,便于问题的拆解,职责的划分,如果一个命令要修改多个聚合根,应该通过Saga(Process Manage)来完成

加上这个约定后带来的收益:

  • 同一个聚合根的命令操作都会路由到同一个分区,聚合根就可以常驻内存(In-Memory),这样就不必每次重建聚合根,缓存利用率聚合是100%,是一种大限度利用内存的设计、
  • 命令路由到同一个分区,命令的操作顺序就可以保障(携带聚合根的版本),这就保障了聚合根在同一时刻只有一个在操作,直接避免你了并发问题,因为在设计上是无锁的
  • 关于命令操作顺序的保障,为了提升吞吐,要求队列是无序消费,但队列无序了怎么保证操作是有序的呢,这点就有点类似Flink中的watermarker的设计了,聚合根的mailbox会记录每个消息的版本,如果高版本的数据先到,数据就会暂存,等到中间的版本处理完成才处理,通过mailbox中的顺序保证了操作的有序

聚合内强一致性

聚合设计之初,边界划分其实就很明确,聚合内的强一致也是业务上期望的,实现起来大部分情况下也是单机事务可以搞定

聚合间只能通过领域消息交互

这个限制是为了避免使用Unit of Work,完全利用Saga的编排模式来实现聚合间最终一致性,比较符合人类大脑接收信息的过程

最佳实践