【问题标题】:PubSub + Reliable message delivery to unreliably present subscribersPubSub + 可靠的消息传递给不可靠的订阅者
【发布时间】:2011-06-28 14:21:18
【问题描述】:

我需要构建一个使用 Publish/Subscribe 总线的系统(例如 Mule、ZeroMQ、RabbitMQ),但文献都暗示订阅者应用程序可以可靠地接收来自他们订阅的主题的消息,只要 Pub /Sub 总线能够传递消息。

我有一个系统,其中一些应用程序将可靠地连接到发布/订阅总线,但其他应用程序不会一直处于活动状态或连接到总线。

显而易见的解决方案是在不可靠的应用程序和发布/订阅总线之间建立某种“存在”协议,以便“存在”应用程序可以立即传递它们的消息,而“不存在”应用程序将它们的消息排队等候某种持久性缓冲区,一旦它们完成“在场握手”,排队的消息就会被传递给新出现的应用程序。

是否有任何发布/订阅总线内置了这种功能,或者是否有任何开源插件可以做到这一点?你能指出任何描述这一点的网址吗?

【问题讨论】:

    标签: rabbitmq publish-subscribe mule unreliable-connection reliable-message-delivery


    【解决方案1】:

    您可以使用任何符合 AMQP 的代理(例如 RabbitMQ)轻松实现此行为。

    为您的使用模式选择正确的交换类型。如果您总是发送到绝对命名的目的地,例如chat.messages,您将需要使用direct 交换。

    如果您想进行基于模式的路由,您需要使用topic 交换。然后您可以根据chat.messages.* 等模式进行路由。

    路由在RabbitMQ Tutorials中有更详细的描述。

    要创建您提到的那种持久订阅,请让每个订阅者创建一个该订阅者专用的队列。然后,队列将绑定到您选择的交换机上的相关路由键。

    由于每个订阅者都有自己的队列,消息将在订阅者处于活动状态时被消费,而在订阅者处于非活动状态或断开连接时被存储。

    【讨论】:

      【解决方案2】:

      您没有提到您选择的语言,但在 Java 中,您可以使用 JMS 完成此操作,使用 durable subscribers。 JMS 的任何实现(there are many,包括前面提到的 RabbitMQ)都将支持此功能。

      【讨论】:

        最近更新 更多