消息混淆:发布/发布与多播与扇出

gho*_*ago 38 messaging message-queue amqp publish-subscribe rabbitmq

我一直在为我的公司评估消息传递技术,但我对几个术语之间的概念差异感到非常困惑:

发布/订阅多播扇出 我正在使用以下定义:

  • Pub/Sub有发布者向每个订阅者提供每个消息的单独副本,这意味着存在保证传递的机会
  • 扇出有一个队列推送到所有侦听客户端.
  • 多播只是发送数据,如果有人正在听,那么很好,如果没有,这没关系.没有可能保证客户肯定收到消息.

这些定义是对的吗?或者Pub/Sub模式和组播,直接,扇出等方式来实现模式?

我正在尝试将开箱即用的RabbitMQ定义应用到我们的架构中,但我现在只是试图为我们的应用程序编写规范.

请有人可以告诉我,我是否正确?

Mic*_*lon 40

我对你选择的三个术语进行比较感到困惑.在RabbitMQ中,Fanout和Direct是交换类型.Pub-Sub是一种通用的消息传递模式,但不是交换类型.你甚至没有提到第三个也是最重要的交换类型,即Topic.实际上,只需通过使用相同的绑定密钥声明多个队列,就可以在Topic交换上实现Fanout行为.您可以通过将队列声明*为通配符绑定键来定义主题交换上的直接行为.

Pub-Sub通常被理解为一种模式,其中应用程序发布由多个订阅者消费的消息.

使用RabbitMQ/AMQP时,务必记住消息始终发布到交换机.然后交换路由到队列.队列向订阅者发送消息.交换的行为很重要.在主题交换中,来自发布者的路由密钥与来自订户的绑定密钥匹配,以便做出路由决定.绑定密钥可以具有通配符模式,这进一步影响路由决策.可以使用报头交换类型基于消息报头的内容完成更复杂的路由

RabbitMQ不保证消息的传递,但是您可以通过选择正确的选项(传递模式= 2表示持久性消息)来确保传递,并在运行应用程序之前声明交换和队列,以便不丢弃消息.

  • 这就是我所希望的答案。不知道主题可以模拟其他交换类型,所以这很有用。 (3认同)

Bri*_*lly 9

你的定义非常正确.请注意,保证交付不仅限于发布/订阅,也可以通过扇出来完成.是的,pub/sub是一个非常基本的描述,可以通过扇出,直接等特定方法实现.

您可能会发现更多有用的消息传递模式.有关更多详细信息,请查看企业集成模式.