2011-11-24 78 views
29

我一直在评估通讯技术为我的公司,但我已经成为一些术语之间的概念上的差异很困惑:消息混乱:发布/订阅VS组播VS扇出

的Pub/Sub VS 组播 VS 扇出 我以下定义工作:

  • 的Pub/Sub有出版商提供每个我的单独副本这意味着有保证递送的机会存在
  • 扇出有一个单一的队列推送到所有听 客户端。
  • 多播刚刚发送数据,如果有人正在收听 那么罚款,如果没有,没关系。没有可能保证客户肯定收到信息。

这些定义是正确的?或者是Pub/Sub模式和组播,直接,扇出等方式来获得模式?

我正试图将开箱即用的RabbitMQ定义加入到我们的架构中,但我现在只是在尝试为我们的应用程序编写规范时环顾四周。

请有人告诉我我是否正确?

回答

32

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

Pub-Sub通常被理解为应用程序发布由多个订阅者使用的消息的模式。

使用RabbitMQ/AMQP时,务必记住邮件始终发布给交易所。然后交换路由到队列。队列将消息传递给订阅者。交易所的行为很重要。在主题交换中,来自发布者的路由密钥与用户的绑定密钥相匹配,以便作出路由决定。绑定密钥可以具有通配符模式,这进一步影响了路由决策。更复杂的路由可以done based on the content of message headers使用头文件交换型

的RabbitMQ不保证信息的传送,但你可以通过选择正确的选项(传送模式= 2持久性消息),并宣布交流和队列中得到保证的交付提前运行您的应用程序,以便不会丢弃消息。

+1

这是我所希望的那种答案。不知道这些话题可以模拟其他交换类型,因此很有用。 – ghostJago

+0

注意:使用Topic交换来模拟扇出或直接比使用任一特定交换类型慢_slightly_慢。这是经典的性能/灵活性折衷。 – cdeszaq

+0

这不是真的。你不能用任务队列模拟扇出。这是因为在第一次消费故事结束后。 – iddqd

6

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

还有更多的消息传递模式,你可能会觉得有用。有关更多详细信息,请参阅Enterprise Integration Patterns

+3

+1用于提示EIP书籍。 –

+0

是的,很棒的书。 –

1

从电子交换的角度来看,术语“多播”意味着“消息被放置在电线上一次”,所有正在监听的客户端应用程序都可以从“电线”上读取消息。任何为N个客户端创建N个消息副本的解决方案都不是多播。除了检查源代码之外,人们还可以使用“嗅探器”来确定通过消息传递系统发送的消息有多少副本。是的,多播消息是UDP协议消息的一种形式。有关一般描述,请参阅:http://en.wikipedia.org/wiki/Multicast。大约十年前,我们使用TIBCO支持多播的消息系统。请参阅:https://docs.tibco.com/pub/ems_openvms_c_client/8.0.0-june-2013/docs/html/tib_ems_users_guide/wwhelp/wwhimpl/common/html/wwhelp.htm#context=tib_ems_users_guide&file=EMS.5.091.htm