首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql事务和RabbitMq

问Mysql事务和RabbitMq
EN

Stack Overflow用户
提问于 2015-02-12 04:30:38
回答 3查看 2.9K关注 0票数 2

我必须在mysql数据库中执行一次保存,然后通过rabbitmq向我的客户端发送一个事件。

现在,当推送到RMq时,如果由于某种原因而失败,我需要回滚保存。它应该是all或nothing,数据库中不能有未发出事件的数据。

所以从本质上讲,

代码语言:javascript
复制
Begin Transaction
Save to db
Push to queue
If exception rollback else commit
End transaction

另一种方法

现在,我只能在事务中执行保存操作。然后,如果队列失败,可以通过某种方法重试排队,但这会变得过于复杂。

这方面有什么最佳实践吗?关于遵循哪种方法的任何建议。

PS: rmq上的事件包含一些数据已更改的ids。客户端需要对更改后的ids执行http get,以执行其操作。

EN

回答 3

Stack Overflow用户

发布于 2015-02-12 06:49:28

嗯,你做的每件事都是对的。RabbitMQ guys发表了一篇关于信号量队列的好文章:https://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq/

我认为这是一个“最佳实践”,因为它是由以某种方式参与开发RabbitMQ的人编写的。

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 19:42:10

如果我理解正确的话,您主要关心的是您是否成功发布了要交换的消息。您可以在RabbitMQ中使用Confirms来确保队列接受您的消息。

根据您是如何在数据库中设计更新的,以及从数据库更新到客户端获取ID所能容忍的时间差有多大,就会想到以下几点:

  1. 您可以在数据库中添加一个新字段,用作检查特定更新的消息是否发送到RabbitMQ的标志。在执行更新时,将标志设置为0,尝试将消息发布到交换,如果成功,则将标志更新为1。如果在向客户端发送消息之前需要使用旧值,并且需要以一定的时间间隔遍历数据库,并尝试为所有未设置标志为1的行将消息再次发送到RabbitMQ,则这可能会很复杂。
  2. 将消息发布到RabbitMQ,如果您得到确认,则提交DB更新。如果由于任何原因提交失败,您的客户端将执行更新,但会获得通常不会有问题的旧值,但这实际上取决于您的应用程序。这可能是更好/更简单的方法,特别是因为没有理由期望任何事情总是失败。您还应该考虑在客户端添加某种形式的延迟,使其从接收更新ID到实际执行更新(以便为数据库更新留出一些时间)。
票数 0
EN

Stack Overflow用户

发布于 2015-02-13 03:15:08

在这种异构环境中,您可以使用Two Phase Commits。将“脏”记录添加到数据库,发布消息,然后编辑记录以将其标记为“干净”和就绪。

此外,在处理消息传递中间件时,您必须准备好某些消息可能会丢失或其使用者无法完全处理它,因此可能需要来自使用者的一些反馈,例如您发布消息,当使用者接收到它时,它将向数据库添加记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28463898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档