RabbitMQ + Node.js = rabbit.js
对于那些不常上网的人来说,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 用于轻松的消息传递。