跳至主要内容

rabbitmq + node.js = rabbit.js

·阅读 3 分钟
Michael Bridgen

对于那些远离互联网的人来说,node.js 是一个基于 Google V8 的事件驱动的 JavaScript 引擎。因为它本质上是一个大型高效的事件循环,所以非常适合处理数据来回传输且中间状态很少的程序。而且编程起来很有趣,显然很多人也这么认为,因为围绕它出现了大量的库。

在这些库中,比较令人印象深刻的是 Socket.IO。可以将 Socket.IO 与 node.js 内置的 Web 服务器结合使用来创建 WebSocket 服务器,并为浏览器提供一个 Socket 抽象层,当没有 WebSocket 时会降级到 XHR 技巧。(我很乐意相信 node.js 和 Socket.IO 是由一个仁慈且有远见的先驱种族为我们创造的;但当然,它们是由勤劳聪明的 人们创造的。谢谢,大家!)

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

继与 ZeroMQMartin Sustrik 合作进行的工作之后,我决定为在浏览器 Socket 上使用创建一个非常简单的协议,反映 ZeroMQ 中(以及 RMQ-0MQ 中)使用的消息模式——发布/订阅请求/回复推送/拉取(或管道)。我编写了一个 node.js 库,它使用 RabbitMQ 通过其路由和缓冲来实现消息模式;由于 RabbitMQ 有一堆各种语言的协议适配器和客户端,因此桥接功能随之而来。

消息模式的简要说明

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

请求/回复用于通过消息进行 RPC;请求在工作进程之间进行轮询分发,回复路由回请求 Socket。这可以被浏览器用来查询后端服务;甚至可以用于浏览器相互查询。

管道用于将进程链接在一起。消息被轮询分发到工作进程,这些工作进程本身可能会推送到另一个处理阶段。这可以用来协调用户组(或个人)之间的工作流程。

在 duly dispense with ado 之后,这里就是 rabbit.js

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

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

总而言之,我惊讶于我只需几行代码和一些各具优势的技术就能完成多少工作——node.js 用于有趣的网络服务器编程,Socket.IO 用于神奇的浏览器 Socket,以及 RabbitMQ 用于无泪消息传递。

© 2024 RabbitMQ. All rights reserved.