DDD - 域事件存储和发布的架构
DDD - Architecture for Domain event storing and publishing
我正在为我们的应用程序实现域事件框架,下面是伪代码,想知道是否有任何明显的注意事项
该框架将设计为 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 将成为消息传递基础设施。
第一部分很好,因为您对事件和模型数据使用相同的数据库。因此,交易涵盖一切。
不过,您可能对 RabbitMQ 中的重复事件有疑问。考虑以下情况:
- 您的应用向 RabbitMQ 发布了一个事件。
- RabbitMQ 正确接收事件。
- 在您的本地持久性更新期间,您的应用程序崩溃了。
因此,您将在恢复后再次向 RabbitMQ 发送相同的事件。这有效地复制了 RabbitMQ 中的事件。
通常可以通过在接收端使用唯一事件 ID and/or 执行重复数据删除来缓解此问题。您可能还想阅读 RabbitMQ reliability guide.
我正在为我们的应用程序实现域事件框架,下面是伪代码,想知道是否有任何明显的注意事项
该框架将设计为 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 将成为消息传递基础设施。
第一部分很好,因为您对事件和模型数据使用相同的数据库。因此,交易涵盖一切。
不过,您可能对 RabbitMQ 中的重复事件有疑问。考虑以下情况:
- 您的应用向 RabbitMQ 发布了一个事件。
- RabbitMQ 正确接收事件。
- 在您的本地持久性更新期间,您的应用程序崩溃了。
因此,您将在恢复后再次向 RabbitMQ 发送相同的事件。这有效地复制了 RabbitMQ 中的事件。
通常可以通过在接收端使用唯一事件 ID and/or 执行重复数据删除来缓解此问题。您可能还想阅读 RabbitMQ reliability guide.