我正在为我们的应用程序实现域事件框架,下面是相同的伪代码,想知道是否有任何明显的警告
该框架将设计为2步,以便持久化域事件(以后需要重建模型状态或者我们添加说混合报告系统)和发布基础结构
存储
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将成为基础消息传递。
答案 0 :(得分:1)
第一部分很好,因为您使用相同的数据库来处理事件和模型数据。因此,交易涵盖了一切。
但是,RabbitMQ中的重复事件可能存在问题。想想以下情况:
因此,您将在恢复后再次向RabbitMQ发送相同的事件。这有效地复制了RabbitMQ中的事件。
通常可以通过在接收方端具有唯一的事件ID和/或执行重复数据删除来缓解此问题。您可能还想阅读RabbitMQ reliability guide。