ayo*_*age 10 database domain-driven-design message-queue eventual-consistency microservices
我有一个应用程序,我需要将一些数据存储在数据库(例如mysql)中,然后在消息队列中发布一些数据.我的问题是:如果应用程序在数据库中存储后崩溃,我的数据将永远不会写入消息队列然后丢失(因此我的系统的最终一致性将无法保证).我怎么解决这个问题 ?
Voi*_*son 16
我有一个应用程序,我需要将一些数据存储在数据库(例如mysql)中,然后在消息队列中发布一些数据.我的问题是:如果应用程序在数据库中存储后崩溃,我的数据将永远不会写入消息队列然后丢失(因此我的系统的最终一致性将无法保证).我怎么解决这个问题 ?
在这种特殊情况下,答案是从数据库加载队列数据.
也就是说,您在用于写入数据的同一事务中编写需要排队到数据库的消息.然后,异步地,您从数据库中读取该数据,并将其写入队列.
请参阅Udi Dahan的" Reliable Messaging without Distributed Transactions".
如果应用程序崩溃,则恢复很简单 - 在重新启动期间,您将在数据库中查询所有未确认的消息,然后再次发送它们.
评论太长了。
我假设你有一个无损消息队列,一旦你得到写入数据的确认,队列就保证有记录。
基本上,您需要一个带有可以回滚的事务或数据库中的状态的循环。交易的伪代码是:
就个人而言,我可能会使用以下状态来执行此操作:
在从故障中恢复的情况下,您可能需要检查消息队列以查看是否有任何“待处理”记录实际写入队列。