用于域事件存储和发布的java DDD体系结构
我正在为我们的应用程序实现域事件框架,下面是相同的伪代码,我想知道是否有任何明显的警告
该框架将分两步设计,以便持久化域事件(稍后在需要时重构模型状态,或者我们在混合中添加报告系统)和发布基础设施
储存
begin txn
update model
Domaineventpublsisher.publish(event)
events serialized and stored to the persistence store by the Domaineventpublisher
commit txn
出版
timer triggers and the registered event dispatchers are notified
event dispatcher reads from of db unsent events
begin txn
the unsent events are published thro rabbitmq and persistence is updated with the last dispatched event
commit txn
这是最简单的一个,我可以提出一个基于一点研究,只是不想忽视任何事情
持久性将是连接池Postgres,正如前面提到的,RabbitMQ将是消息传递基础
# 1 楼答案
第一部分很好,因为您对事件和模型数据使用相同的数据库。因此,该事务跨越了一切
不过,RabbitMQ中的重复事件可能会有问题。想想下面的例子:
因此,在恢复后,您将再次向RabbitMQ发送相同的事件。这有效地复制了RabbitMQ中的事件
通常可以通过在接收方拥有唯一的事件ID和/或执行重复数据消除来缓解此问题。您可能还想阅读RabbitMQ reliability guide