Rabbitmq 消息总线:发件人必须等待多个收件人的确认

Rabbitmq 消息总线:发件人必须等待多个收件人的确认,rabbitmq,message-bus,Rabbitmq,Message Bus,在我们的应用程序中,发布者创建一条消息并将其发送到主题 然后,当主题的所有订阅者确认消息时,它需要等待 如果不显示,消息总线实现可以自动执行此操作。因此,我们倾向于让每个订户在完成后为客户端发送自己的新消息 现在,客户端可以接收所有这样的消息,当它从每个目的地收到一条消息时,就可以执行它必须执行的任何清理操作。但是,如果客户端(发送方)在确认流中部分崩溃怎么办?为了处理这样的不幸,我需要(重新)在客户机上实现总线已经实现的功能——保存传入的确认,直到获得足够的确认 我不相信,我们的需求是如此深奥

在我们的应用程序中,发布者创建一条消息并将其发送到主题

然后,当主题的所有订阅者确认消息时,它需要等待

如果不显示,消息总线实现可以自动执行此操作。因此,我们倾向于让每个订户在完成后为客户端发送自己的新消息

现在,客户端可以接收所有这样的消息,当它从每个目的地收到一条消息时,就可以执行它必须执行的任何清理操作。但是,如果客户端(发送方)在确认流中部分崩溃怎么办?为了处理这样的不幸,我需要(重新)在客户机上实现总线已经实现的功能——保存传入的确认,直到获得足够的确认

我不相信,我们的需求是如此深奥——如果发送者(发布者)必须等待多个接收者(订阅者)的确认,您将如何处理这种情况?有点像请求(并等待)每个订阅者向邮件列表发送回执


如果重要的话,我们正在使用RabbitMQ。谢谢

您正在寻找的功能听起来像是一个消息传递解决方案,可以跨消息发布者和订阅者执行事务。在Java世界中,JMS指定这样的事务。JMS实现的一个示例是

RabbitMQ不提供这样的功能,而且有充分的理由。RabbitMQ是为非常健壮而构建的,同时它的性能也非常出色。您描述的事务行为只有以合理的性能损失为代价才能实现(特别是如果您希望保持出色的健壮性)

使用RabbitMQ,确保消息被成功使用的一种方法实际上是在使用者端发布应答消息,然后由原始发布者使用。这可以通过帮助您为您的问题设置获得一个干净的解决方案来实现

如果(原始)发布服务器在收到所有答案之前崩溃,您可以假定所有未完成的答案仍在代理服务器上排队。因此,您必须以能够继续处理这些遗留消息的方式构建发布服务器。这可能不是小事

最后,我推荐以下解决方案:设计制作组件时,您可以使用一个或多个与原始发布服务器分离的专用答案使用者来使用答案

此解决方案的好处是:

  • 原始出版者可以独立于消费者的成功完成其任务
  • 原始发布服务器独立于用户可用性和速度
  • originpublisher的实现要简单得多
  • 在崩溃场景中,答案使用者可以继续处理答案
  • 现在来看一个更一般的问题:消息传递的一个主要好处是代理对应用程序组件进行解耦。在AMQP中,这是通过交换和绑定实现的,这些交换和绑定允许您将消息分发逻辑从应用程序移动到配置的中心点

    如果向客户端添加RPC样式的调用,则组件很可能再次紧密耦合,这意味着如果某个消费组件出现故障/不可用/速度太慢,发布组件将失败。这正是你想要避免的。否则,你为什么要拆分组件呢


    我的建议是,在设计应用程序时,发布者应尽可能独立于消费者的成功完成其任务。反向通道应该是一种例外情况,并以所述的非耦合方式实施。

    谢谢,Chris。是的,这就是我们所做的:每个使用者将自己的消息“返回”——发送到一个单独的队列,该队列由原始发布者指定。它的工作原理——也许比使用RPC更好,因为这些确认的聚合器不必与确认消费者同时在线。但是聚合器的代码重新实现了一些已经在代理中找到的功能(比如重启容忍度),我希望利用后者达到这个目的。。。