域事件的可靠异步处理
Reliable Asynchronous Handling of Domain Events
在并发系统中,域事件通常是异步处理的。在 Go 中,可以通过 channels 实现一种简单的异步事件处理方法,但问题是如果处理事件发生了不好的事情,或者最坏的情况是整个程序,事件会丢失。
如何在 Go 程序中正确处理异步域事件,即:
- 当事件处理程序失败时,不应从事件队列中清除该事件,以便稍后妥善处理。
- 如果整个程序宕机,则必须恢复事件并进行相应处理。
第一个相对容易;您可以在工作人员中有一个错误处理程序,在发生错误时重新排队工作。
第二个更难;你的选择是 a) 推出你自己的防弹机制,将事件写入磁盘并在它们以线程安全的方式完成时清除它们,或者 b) 使用许多已经证明可靠的流行系统之一,例如RabbitMQ 或 Kafka,具有适当的复制和冗余以确保您需要的可靠性级别。我强烈推荐后者。
在并发系统中,域事件通常是异步处理的。在 Go 中,可以通过 channels 实现一种简单的异步事件处理方法,但问题是如果处理事件发生了不好的事情,或者最坏的情况是整个程序,事件会丢失。
如何在 Go 程序中正确处理异步域事件,即:
- 当事件处理程序失败时,不应从事件队列中清除该事件,以便稍后妥善处理。
- 如果整个程序宕机,则必须恢复事件并进行相应处理。
第一个相对容易;您可以在工作人员中有一个错误处理程序,在发生错误时重新排队工作。
第二个更难;你的选择是 a) 推出你自己的防弹机制,将事件写入磁盘并在它们以线程安全的方式完成时清除它们,或者 b) 使用许多已经证明可靠的流行系统之一,例如RabbitMQ 或 Kafka,具有适当的复制和冗余以确保您需要的可靠性级别。我强烈推荐后者。