我必须在mysql数据库中执行一次保存,然后通过rabbitmq向我的客户端发送一个事件。
现在,当推送到RMq时,如果由于某种原因而失败,我需要回滚保存。它应该是all或nothing,数据库中不能有未发出事件的数据。
所以从本质上讲,
Begin Transaction
Save to db
Push to queue
If exception rollback else commit
End transaction另一种方法
现在,我只能在事务中执行保存操作。然后,如果队列失败,可以通过某种方法重试排队,但这会变得过于复杂。
这方面有什么最佳实践吗?关于遵循哪种方法的任何建议。
PS: rmq上的事件包含一些数据已更改的ids。客户端需要对更改后的ids执行http get,以执行其操作。
发布于 2015-02-12 06:49:28
嗯,你做的每件事都是对的。RabbitMQ guys发表了一篇关于信号量队列的好文章:https://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq/
我认为这是一个“最佳实践”,因为它是由以某种方式参与开发RabbitMQ的人编写的。
发布于 2015-02-12 19:42:10
如果我理解正确的话,您主要关心的是您是否成功发布了要交换的消息。您可以在RabbitMQ中使用Confirms来确保队列接受您的消息。
根据您是如何在数据库中设计更新的,以及从数据库更新到客户端获取ID所能容忍的时间差有多大,就会想到以下几点:
发布于 2015-02-13 03:15:08
在这种异构环境中,您可以使用Two Phase Commits。将“脏”记录添加到数据库,发布消息,然后编辑记录以将其标记为“干净”和就绪。
此外,在处理消息传递中间件时,您必须准备好某些消息可能会丢失或其使用者无法完全处理它,因此可能需要来自使用者的一些反馈,例如您发布消息,当使用者接收到它时,它将向数据库添加记录。
https://stackoverflow.com/questions/28463898
复制相似问题