跳到主要内容

3 篇帖子被标记为 “Hasenwerkstatt”

查看所有标签

AMQP 1.0 原型开发

·2 分钟阅读
Michael Bridgen

我们一直在进行一个新协议的原型开发支持,这符合我们一贯的做法。这个协议被称为 “AMQP 1.0 R0”,它是 AMQP 工作组(RabbitMQ 和后来的 VMware 都是其成员)的最新版本。“R0” 表示这是建议的第一个修订版。该规范尚不完整:有很多待办事项(TODO),并且在很大程度上未经证实。这两个事实是促使我们进行原型开发的部分原因。

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

AMQP 1.0 R0 规范与以前版本的 AMQP 规范不同,因为它没有定义代理模型;也就是说,它没有定义交换机、队列和绑定,或它们的等价物。该协议实际上只关注将消息从一个代理传输到另一个代理,然后就结果达成一致。这意味着它可以附加到消息代理实现中,以及其他用途——其理念是人们可以调整现有模型以适应需求。

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

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

创新的一大部分是填补规范中沉默的语义空白。其中一些在我们为 AMQP 工作组所做的这份客户端-代理协议工作中得到了详细说明。我们希望原型开发将有助于进一步完善这一点。

下周,我将把我们的原型带到 AMQP 1.0 “Connectathon”,在那里它将针对核心协议的其他实现进行测试(并非所有实现都是开源的)。同样,这将有助于找出规范中互操作性的障碍。

rabbitmq + node.js = rabbit.js

·3 分钟阅读
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。(请注意,您需要 我的 node-amqp 分支。)

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

总而言之,我惊讶于仅用几行代码和一些恰到好处的技术就能完成这么多工作——node.js 用于有趣的网路服务器编程,Socket.IO 用于神奇的浏览器套接字,以及 RabbitMQ 用于无忧的消息传递。

© . All rights reserved.