知识卡片
事件与聚合异库靠发布或轮询并以幂等达成恰好一次
内容
要发挥事件异步非阻塞特性,可把事件与聚合存于不同数据库:先持久化事件,再把事件最新状态反映到业务库形成对聚合的操作,通过发布或轮询事件搭建两库间的桥梁——事件不仅溯源还起通知状态变更的作用。跨进程需引入事件总线(Kafka/RabbitMQ)。发布/轮询都涉及分布式事务一致性(要协调存事件、发消息、更新聚合、更新事件表标记),但事件存储与聚合更新不要求强一致。许多中间件保证「至少一次」投递,只要订阅方保证更新聚合的幂等性即可变相实现「恰好一次」;创建操作非幂等,可先查业务库是否已存在该聚合ID、或引入事件发送历史表来去重。轮询可用 published 列标记避免重复发布。发散:异步方案的正确性最终落在「订阅方幂等」这一个点上。
参考来源
- 位置:《解构领域驱动设计》附录B B.2.5(源文件:_epub-src/OEBPS/035.xhtml)
- 结论依据:原文给出事件与聚合异库、发布/轮询、分布式一致性与幂等去重的方案。
- 原始内容:要充分发挥事件异步非阻塞的特性,可以考虑将事件和聚合存储在不同数据库……只要事件的订阅方保证更新聚合状态操作的幂等性,就能……变相地做到了恰好一次。