Transactions 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

我有一个RabbitMQ消息结构,其中一条消息
a
应该生成许多消息,让我们称它们为
B
C
。工作进程接收消息
A
,然后对其进行处理并生成消息
B
C

假定的工作流流程如下所示:

  • 接收带有
    ack=False的
    a
    消息
  • 启动交易
  • 运行一些代码
  • 生成消息
    B
  • 生成消息
    C
  • 发送消息
    A的
    ack
  • 完成交易
  • 在任何情况下,工作进程在消息
    a
    的处理过程中死亡,或者当is尚未完成事务时-我希望RabbitMQ将消息
    a
    视为未送达,并将其重新排队

    RabbitMQ在高可用性配置中运行(如果相关)

    为什么问题是试图清除RabbitMQ文档,说明:

    此外,RabbitMQ即使在仅涉及单个队列的事务的情况下也不提供原子性保证,例如,tx.commit期间的故障可能导致代理重新启动后队列中出现事务发布的子集

    • 在RabbitMQ或市场上任何其他排队软件的环境中,有没有任何方法可以实现我想要的行为
    • 有没有什么方法可以让RabbitMQ在多个队列中工作

    您需要相当多的基础设施(代码)才能使其正常工作。这相当棘手

    <>你可能想考虑一下服务总线。我这里有一个免费的.net开源软件:

    如果您不在.net空间中,或者对使用服务总线不感兴趣,那么您可以按照部分代码了解Shuttle.Esb是如何处理这些事情的:

    您还可以在此处查看
    幂等服务

    当使用幂等服务器(在处理程序中)时,所有发送的消息都存储在事务存储中(如本例中的sql server),并且仅在消息处理成功完成后发送

    要在消息处理程序之外发送,可以使用事务发件箱(同样,基于sql server表的队列也可以工作)


    关键是,您需要认真考虑您的设计,这将是一件棘手的事情。

    您需要相当多的基础设施(代码)才能使其正常工作。这相当棘手

    <>你可能想考虑一下服务总线。我这里有一个免费的.net开源软件:

    如果您不在.net空间中,或者对使用服务总线不感兴趣,那么您可以按照部分代码了解Shuttle.Esb是如何处理这些事情的:

    您还可以在此处查看
    幂等服务

    当使用幂等服务器(在处理程序中)时,所有发送的消息都存储在事务存储中(如本例中的sql server),并且仅在消息处理成功完成后发送

    要在消息处理程序之外发送,可以使用事务发件箱(同样,基于sql server表的队列也可以工作)


    关键是你需要认真考虑一下你的设计,这将是一个棘手的问题。

    我犯了一个错误,因为我把目标锁定在了最受欢迎的产品上,这在我看来是错误的。ActiveMQ完全支持高可用性和事务,所以我刚切换到它,我的问题就消失了。

    我犯了一个错误,因为我把目标锁定在了最受欢迎的产品上,这在我看来是错误的。ActiveMQ完全支持高可用性和事务,因此我刚刚切换到它,我的问题就消失了。

    我们有一些系统在生产中的工作方式与此完全相同,基本格式为:

  • 得到消息
  • 工作
  • 确认消息A
  • 如果步骤#2失败,消息A将“重新排队”,并可再次拾取

    将消息发送到队列并成功接收时,该消息将标记为
    就绪
    。然后,当它被发送到消费者时,它被标记为
    未确认
    ,直到被所述消费者确认,此时它被从队列中移除

    在您的示例中,在步骤6中确认消息之前,它仍然处于
    未确认
    状态,这意味着如果工作进程在步骤6之前死亡,消息将滑回RabbitMQ中的
    就绪
    状态,准备发送给另一个工作进程


    此功能确实依赖于您没有显式禁用确认这一事实。如果您是,我敢肯定消息发送给消费者后会立即从队列中删除。

    我们有一些系统在生产中的工作方式与此完全相同,基本格式如下:

  • 得到消息
  • 工作
  • 确认消息A
  • 如果步骤#2失败,消息A将“重新排队”,并可再次拾取

    将消息发送到队列并成功接收时,该消息将标记为
    就绪
    。然后,当它被发送到消费者时,它被标记为
    未确认
    ,直到被所述消费者确认,此时它被从队列中移除

    在您的示例中,在步骤6中确认消息之前,它仍然处于
    未确认
    状态,这意味着如果工作进程在步骤6之前死亡,消息将滑回RabbitMQ中的
    就绪
    状态,准备发送给另一个工作进程


    此功能确实依赖于您没有显式禁用确认这一事实。如果是这样,我敢肯定消息在发送给消费者时会立即从队列中删除。

    我确切知道如何实现这一点-支持SQL的解决方案将是一个幼稚的解决方案。我的我