我一直在为我的公司评估消息传递技术,但我对几个术语之间的概念差异感到非常困惑:
发布/次级 vs 多播 vs 扇出 我正在使用以下定义:
这些定义是否正确?或者Pub / Sub模式和组播,直接,扇出等方式来实现模式?
我正在尝试将开箱即用的RabbitMQ定义应用到我们的架构中,但我现在只是试图为我们的应用程序编写规范。“/ p>
请有人可以告诉我我是否对吗?
答案 0 :(得分:37)
我对你选择的三个术语进行比较感到困惑。在RabbitMQ中,Fanout和Direct是交换类型。 Pub-Sub是一种通用的消息传递模式,但不是交换类型。你甚至没有提到第三个也是最重要的交换类型,即Topic。实际上,只需通过使用相同的绑定密钥声明多个队列,就可以在Topic交换上实现Fanout行为。您可以通过声明带有*
的队列作为通配符绑定密钥来定义主题交换上的直接行为。
Pub-Sub通常被理解为一种模式,其中应用程序发布由多个订阅者使用的消息。
使用RabbitMQ / AMQP时,务必记住消息始终发布到交换机。然后交换路由到队列。队列向订阅者发送消息。交换的行为很重要。在主题交换中,来自发布者的路由密钥与来自订户的绑定密钥匹配,以便做出路由决定。绑定密钥可以具有通配符模式,这进一步影响路由决策。使用标头交换类型
可以done based on the content of message headers更复杂的路由RabbitMQ不保证邮件的传递,但是您可以通过选择正确的选项(传递模式= 2表示持久性消息)以及在运行应用程序之前声明交换和队列以便不丢弃消息来获得有保证的传递。
答案 1 :(得分:9)
你的定义非常正确。请注意,保证交付不仅限于发布/订阅,也可以通过扇出来完成。是的,pub / sub是一个非常基本的描述,可以通过扇出,直接等特定方法实现。
您可能会发现更多有用的消息传递模式。有关详细信息,请查看Enterprise Integration Patterns。
答案 2 :(得分: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