跳至主要内容

3 篇包含“Hasenwerkstatt”标签的文章

查看所有标签

AMQP 1.0 原型设计

·阅读时间:2分钟
Michael Bridgen

我们一直在对一个新的协议进行原型设计,这符合我们的习惯。这个协议称为“AMQP 1.0 R0”,它是AMQP工作组(RabbitMQ以及后来VMware都是成员)的新发布。 “R0”表示它是建议的第一个修订版。规范尚不完整:有很多待办事项,并且在很大程度上尚未得到验证。这两个事实是我们促使进行原型设计的部分原因。

原型代码镜像在github上:https://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连接起来;不仅可以桥接到其他协议和后端系统,还可以提供浏览器之间、应用程序服务器之间等的消息传递。

继与ZeroMQMartin 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用于无泪消息传递。

© 2024 RabbitMQ. All rights reserved.