RabbitMQ/0MQ 桥接
最近,Michael Bridgen 和我实现了一个桥接器,用于将 RabbitMQ 消息代理与使用 0MQ 进行消息传递的应用程序连接起来。
这是它的链接:http://github.com/rabbitmq/rmq-0mq
那么:用户并行使用这两种产品可以获得什么样的好处呢?
简而言之,这里涉及两种不同的观点。RabbitMQ 用户体验到的好处与 0MQ 用户不同。 那些已经同时使用两者的人将获得一种轻松互连这两种技术的方法。
这是 RabbitMQ 博客,所以让我们从以 Rabbit 为中心的角度开始。
首先也是最明显的,在没有 AMQP 客户端可用的平台上,使用 0MQ 作为 RabbitMQ 消息代理的客户端是有意义的。有没有想过从 Lisp 连接到 RabbitMQ 消息代理?或者 - 比如说 - 从 Cobol?这个桥接器在这里可能会派上用场。
同样适用于操作系统/硬件平台。您需要从内存严重受限、CPU 非常慢或电池寿命有限的设备连接到消息代理吗? 0MQ 客户端非常简洁且速度非常快,这意味着即使在慢速芯片上您也能获得合理的性能。 有效性还转化为更低的功耗,从而使电池寿命更长。r0mq 桥接器本身与 RabbitMQ 消息代理位于同一位置,客户端无需额外的资源。
桥接器的另一个用途要复杂得多。如果您在非常简单的场景中使用 RabbitMQ,您可能甚至不会体会到它的价值。如果您正在管理一个大型的地理分布式系统,它可能会成为救命稻草。该桥接器可用于将 RabbitMQ 消息代理互连成松散的联邦。只需编辑两个消息代理的配置文件,一切就会正常工作。您不必担心启动消息代理的顺序、管理网络中断后的重新连接等。一个不错的功能是这些联邦是真正分布式的。无需对联邦进行中央治理。只需将您的消息代理连接到另一家公司的消息代理。然后,该消息代理又连接到其他公司的消息代理等。最终,您将得到一个由所有参与者以协作方式维护的松散的全球联邦。
您可以利用的另一个优势是高效利用网络资源。与 AMQP 不同,0MQ 允许您将消息流量拆分为逻辑上独立的流。 您将娱乐视频放在与用于保持飞机飞行的命令不同的流中传输。 这不仅意味着您永远不会遇到队头阻塞问题,而且还意味着可以为娱乐频道和转向系统分别设置网络级 QoS。 此外,网络工程师会很高兴您可以逐流监控网络流量,而不是监控被“消息传递”占用的大量不透明带宽。
最后,0MQ 与 OpenPGM 库捆绑在一起,该库实现了一种名为 PGM 的可靠多播协议。 因此,r0mq 桥接器允许将消息从 RabbitMQ 消息代理多播到客户端(确切地说是 0MQ 客户端 - AMQP 没有多播支持)。 这种功能在大量相同数据传递到 LAN 上的许多盒子的场景中非常有用。 如果将每个数据的单独副本发送给每个订阅者,您很容易超出网络的容量。 使用多播,数据仅发送一次给所有订阅者,从而即使在订阅者数量增加时也保持带宽使用率恒定。
当您从另一个角度看待 r0mq 桥接器时,您可能正在使用 0MQ 作为您的网络传输进行低级别开发。
使用 RabbitMQ 消息代理有一些明显的用途。 其中最简单的用途是将消息代理用作桥接器,将 0MQ 应用程序连接到 AMQP、STOMP 或 XMPP 应用程序。
然而,真正的用例是在 0MQ 网络中将 RabbitMQ 用作“设备”。 0MQ 配备了一些简单的预编译设备。 某些硬件可以用作 0MQ 设备(例如多播传输情况下的 IP 交换机)。 已经有人尝试创建更复杂的设备,但这些设备仍处于非常早期的开发阶段。 因此,0MQ 开发人员缺少的是一个功能齐全、复杂且可用于生产环境的设备。
RabbitMQ 消息代理可以用作这样的设备。 首先,它已被广泛部署,因此足够稳定,可以安全地在生产环境中使用。 至于功能集,它提供的功能远超 0MQ 世界中的任何功能。 两个最有用的功能是持久性和监控。
持久性意味着通过消息代理的消息将保存在磁盘上。 当您关闭消息代理时,如果盒子因断电或其他技术问题而崩溃,消息仍然在磁盘上可用。 当消息代理重新启动时,它们将像崩溃从未发生过一样被进一步发送。 这类似于电子邮件的工作方式。
监控的需求可能比持久性更高。 一旦您拥有一个重要的系统,您就想知道每个节点在做什么:特定 feed 存储了多少消息? 当前吞吐量是多少? 等等。 RabbitMQ 可以通过其 命令行工具 或通过 管理插件 告诉您这些信息。
作为结论,我想强调的是,桥接 0MQ 和 RabbitMQ 不仅仅是您在桥接两个不兼容但或多或少等效的产品时获得的那种简单的桥接。 RabbitMQ 和 0MQ 专注于消息传递的不同方面。 0MQ 更加关注消息如何在网络上传输。 另一方面,RabbitMQ 专注于如何存储、过滤和监控消息。 通过结合这两种技术,您可以从两个世界中获得最佳效果。
享受吧!