Transactions RabbitMQ后续消息原子性
我有一个RabbitMQ消息结构,其中一条消息Transactions RabbitMQ后续消息原子性,transactions,rabbitmq,atomicity,Transactions,Rabbitmq,Atomicity,我有一个RabbitMQ消息结构,其中一条消息a应该生成许多消息,让我们称它们为B和C。工作进程接收消息A,然后对其进行处理并生成消息B和C 假定的工作流流程如下所示: 接收带有ack=False的a消息 启动交易 运行一些代码 生成消息B 生成消息C 发送消息A的ack 完成交易 在任何情况下,工作进程在消息a的处理过程中死亡,或者当is尚未完成事务时-我希望RabbitMQ将消息a视为未送达,并将其重新排队 RabbitMQ在高可用性配置中运行(如果相关) 为什么问题是试图清除RabbitM
a
应该生成许多消息,让我们称它们为B
和C
。工作进程接收消息A
,然后对其进行处理并生成消息B
和C
假定的工作流流程如下所示:
ack=False的a
消息
B
C
A的ack
a
的处理过程中死亡,或者当is尚未完成事务时-我希望RabbitMQ将消息a
视为未送达,并将其重新排队
RabbitMQ在高可用性配置中运行(如果相关)
为什么问题是试图清除RabbitMQ文档,说明:
此外,RabbitMQ即使在仅涉及单个队列的事务的情况下也不提供原子性保证,例如,tx.commit期间的故障可能导致代理重新启动后队列中出现事务发布的子集
- 在RabbitMQ或市场上任何其他排队软件的环境中,有没有任何方法可以实现我想要的行为
- 有没有什么方法可以让RabbitMQ在多个队列中工作
幂等服务
:
当使用幂等服务器(在处理程序中)时,所有发送的消息都存储在事务存储中(如本例中的sql server),并且仅在消息处理成功完成后发送
要在消息处理程序之外发送,可以使用事务发件箱(同样,基于sql server表的队列也可以工作)
关键是,您需要认真考虑您的设计,这将是一件棘手的事情。您需要相当多的基础设施(代码)才能使其正常工作。这相当棘手 <>你可能想考虑一下服务总线。我这里有一个免费的.net开源软件: 如果您不在.net空间中,或者对使用服务总线不感兴趣,那么您可以按照部分代码了解Shuttle.Esb是如何处理这些事情的: 您还可以在此处查看
幂等服务
:
当使用幂等服务器(在处理程序中)时,所有发送的消息都存储在事务存储中(如本例中的sql server),并且仅在消息处理成功完成后发送
要在消息处理程序之外发送,可以使用事务发件箱(同样,基于sql server表的队列也可以工作)
关键是你需要认真考虑一下你的设计,这将是一个棘手的问题。我犯了一个错误,因为我把目标锁定在了最受欢迎的产品上,这在我看来是错误的。ActiveMQ完全支持高可用性和事务,所以我刚切换到它,我的问题就消失了。我犯了一个错误,因为我把目标锁定在了最受欢迎的产品上,这在我看来是错误的。ActiveMQ完全支持高可用性和事务,因此我刚刚切换到它,我的问题就消失了。我们有一些系统在生产中的工作方式与此完全相同,基本格式为:
就绪
。然后,当它被发送到消费者时,它被标记为未确认
,直到被所述消费者确认,此时它被从队列中移除
在您的示例中,在步骤6中确认消息之前,它仍然处于未确认
状态,这意味着如果工作进程在步骤6之前死亡,消息将滑回RabbitMQ中的就绪
状态,准备发送给另一个工作进程
此功能确实依赖于您没有显式禁用确认这一事实。如果您是,我敢肯定消息发送给消费者后会立即从队列中删除。我们有一些系统在生产中的工作方式与此完全相同,基本格式如下:
就绪
。然后,当它被发送到消费者时,它被标记为未确认
,直到被所述消费者确认,此时它被从队列中移除
在您的示例中,在步骤6中确认消息之前,它仍然处于未确认
状态,这意味着如果工作进程在步骤6之前死亡,消息将滑回RabbitMQ中的就绪
状态,准备发送给另一个工作进程
此功能确实依赖于您没有显式禁用确认这一事实。如果是这样,我敢肯定消息在发送给消费者时会立即从队列中删除。我确切知道如何实现这一点-支持SQL的解决方案将是一个幼稚的解决方案。我的我