DDD-事件溯源

核心价值

1.减少并发冲突
2.记录每个操作细节
3.解耦领域数据模型与业务消息领域数据(四色模型-消息)

实施方案

1.记录事件信息,一定保障(顺序写,时序性,带版本戳,消息ID的生成,微服务节点的无状态化,和ID生成器的workId如何配合)
2.配合CQRS使用,实体最新状态使用”物化视图”(可以定时生成快照,避免全量重播事件,可以使用异步模式)
3.消费事件的服务,需要注意幂等
4.事件解耦后的最终一致性(后续章节描述)
5.事件的消费,一般放到领域aggregate中,以实现领域逻辑内聚。(当然具体逻辑可以使用gateway接口,在infrastructure具体实现)
事件消费也可以使用状态机,提示领域逻辑的可视化。

1
2
3
4
5
6
7
@CommandHandler
public ContractAggregate(CreateContractCommand command, MetaData metaData, UIDGenerator generator) {
if (null == command.getIdentifier()) {
command.setIdentifier(generator.getId());
}
AggregateLifecycle.apply(new ContractCreatedEvent(command.getIdentifier(), command.getName(), command.getPartyA(), command.getPartyB()), metaData);
}

框架支持

Java Axon 框架
实体快照,储存事件,事件重试/升级,事件溯源(fetch拉事件)

参考

http://soooban.github.io/2019/06/10/Event-Sourcing-And-CQRS/

引申问题

实现可靠消息,参加后续文章