跳至主内容

3 篇标记为“Hasenwerkstatt”的文章

查看所有标签

AMQP 1.0 原型设计

·3 分钟阅读
Michael Bridgen

我们一如既往地在对一项新协议的支持进行原型设计。这项新协议名为“AMQP 1.0 R0”,它是 AMQP 工作组(RabbitMQ,以及后来的 VMware,都是其成员)提出的新版本。“R0”表示它是修订版建议的第一个版本。该规范尚不完整:有许多待办事项(TODO),并且在很大程度上尚未经过验证。这两个事实也是促使我们进行原型设计的因素之一。

原型代码已在 github 上镜像:http://github.com/rabbitmq/rabbitmq-amqp1.0。它的构建方式与我们所有的插件完全相同

AMQP 1.0 R0 规范与之前版本的 AMQP 规范不同之处在于,它不定义 broker 模型;也就是说,它不定义 exchange、queue 和 binding,或者它们的等价物。该协议实际上只关乎将消息从一个代理传输到另一个代理,然后就结果达成一致。这意味着它可以附加到消息 broker 实现上,以及其他用途——其理念是人们可以调整现有模型以适应需求。

在我们的案例中,现有的模型是 AMQP 0-9-1 的模型,并包含一些泛化和扩展(例如,链式 binding)。因此,我们原型设计的目标是能够同时使用 1.0 客户端和 0-9-1 客户端连接并完成一些有用的工作。

好消息是,我们已经实现了这一点。实际上,该插件可以配置为替代 Rabbit 原有的网络监听器,并能够愉快地与 AMQP 0-8、0-9-1 和 1.0 客户端进行通信。在此过程中,我们确实进行了一些创新,并且有一些规范的部分是我们没有实现的。这些内容稍后将在 README 文件中详细说明。

其中一项重要的创新是填补规范中未定义的部分。其中一些细节已在我们为 AMQP 工作组所做的客户端-broker 协议工作中有所说明。我们希望原型设计能帮助进一步完善这部分内容。

下周,我将把我们的原型带到AMQP 1.0 “Connectathon”,届时它将与其他核心协议的实现(并非所有实现都是开源的)进行测试。同样,这将有助于消除规范中互操作性方面的障碍。

rabbitmq + node.js = rabbit.js

·阅读时长4分钟
Michael Bridgen

对于那些暂时离开互联网的朋友来说,node.js 是一个基于 Google V8 的事件驱动 JavaScript 引擎。因为它本质上是一个巨大而高效的事件循环,所以它非常适合那些在状态很少的情况下,前后频繁地移动数据的程序。而且它编程起来很有趣,这似乎是很多人共享的观点,因为围绕它已经涌现出大量的库。

这些库中最令人印象深刻的是 Socket.IO。你可以将 Socket.IO 与 node.js 内置的 Web 服务器结合起来,创建一个 WebSocket 服务器,并为浏览器提供一个套接字抽象,在没有 WebSocket 的情况下会退降到 XHR 技巧。(我很高兴能相信 node.js 和 Socket.IO 是由一个仁慈且富有远见的先驱种族为我们创造的;但当然,它们是由勤奋聪明的人创造的。谢谢你们!)

一旦在浏览器中拥有了套接字抽象,一个全新的世界就此打开。具体来说,就我们而言,这是一个全新的消息传递世界。由于 node.js 有一个 AMQP 客户端,我们可以轻松地将其与 RabbitMQ 连接起来;不仅可以连接到其他协议和后端系统,还可以提供浏览器之间、应用程序服务器之间等等的消息传递。

继我们与 ZeroMQ 的 Martin Sustrik 合作的 工作 之后,我决定为浏览器套接字创建一个非常简单的协议,该协议反映了 ZeroMQ (以及因此的 RMQ-0MQ) 中使用的消息传递模式——发布/订阅请求/应答推/拉 (或管道)。我编写了一个 node.js 库,该库使用 RabbitMQ 来实现消息模式,利用其路由和缓冲功能;由于 RabbitMQ 拥有大量协议适配器和各种语言的客户端,因此桥接功能也随之而来。

消息传递模式的简要说明

发布/订阅 适用于已发布的消息需要传递给多个订阅者的情况。在一般情况下,可以使用各种路由方式来过滤每位订阅者的消息。例如,这可以用于将后端系统的通知广播给用户的浏览器。

请求/应答 用于通过消息传递进行 RPC;请求会以轮询方式分发给工作进程,应答会路由回请求的套接字。这可以由浏览器用来查询后端服务;或者甚至由浏览器互相查询。

管道 用于将进程链接在一起。消息会以轮询方式推送到工作进程,这些工作进程本身可以将消息推送到下一个处理阶段。这可以用于协调用户(或个人)集合之间的工作流程。

在不必要的客套话之后,这里是 rabbit.js

它只需要一个基本的 RabbitMQ 和 node.js 安装;以及 node-amqp 和 Socket.IO 库。安装说明和这些库的位置在 README 中。(请注意,您需要 我 fork 的 node-amqp。)

它还包含一个微型消息套接字服务器;也就是说,一个接受套接字连接并使用带长度前缀的消息进行通信的 node.js 服务器。由于所有通信都通过 RabbitMQ 进行,您可以通过套接字与连接了 Socket.IO 的浏览器进行通信。您还可以使用 node.js 本身代码中的进程内管道服务器。

总而言之,我很惊讶地发现,只需寥寥几行代码和一些各有所长的技术——node.js 用于有趣的服务器端网络编程,Socket.IO 用于神奇的浏览器套接字,以及 RabbitMQ 用于无忧无虑的消息传递——我就能完成这么多工作。

© . This site is unofficial and not affiliated with VMware.