跳至主内容

RabbitMQ-Web-Stomp 介绍

·5 分钟阅读
Marek Majkowski

在 RabbitMQ 总部,我们相当长一段时间以来一直在努力寻找一种好方法来在 Web 浏览器中公开消息传递。过去我们尝试了许多方法,从老牌的 JsonRPC 插件(基本上通过 AJAX 公开 AMQP)到 Rabbit-Socks(试图创建通用的协议集线器),再到管理插件(可用于发送和接收来自浏览器消息等基本功能)。

随着时间的推移,我们了解到 Web 上的消息传递与我们习惯的方式截然不同。我们所做的任何尝试都未能真正解决这个问题,而且 Web 上的消息传递可能在很长一段时间内都不是一个完全解决的问题。

尽管如此,RabbitMQ 用户一直在询问一个简单的事情,虽然它并不完美,但它远非在浏览器中进行消息传递的最糟糕方式:通过 Websockets 公开 STOMP。

STOMP + Websockets

我们很高兴为 RabbitMQ 推出一款新插件

它本质上是 RabbitMQ-STOMP 插件与 Websockets 服务器(SockJS)之间的桥梁。希望它能成为一系列 Web 端 RabbitMQ 用例的理想解决方案。

它实际做了什么

在 RabbitMQ 内部

RabbitMQ-Web-Stomp 的逻辑非常简单。它获取 RabbitMQ-STOMP 插件提供的 STOMP 协议,并通过 SockJS 服务器将其暴露出来。

传输协议

用户可以使用可靠的 SockJS 协议从任何浏览器连接到 SockJS 端点。即使在不支持原生 Websockets 的浏览器中,或者在阻断非 HTTP 传输的受限代理环境背后,它也能正常工作。

此外,对于不需要这种复杂性的用户,SockJS 还暴露了一个原始的 websockets URL,可以直接从支持 Websockets 的现代浏览器进行访问。

在浏览器中

在浏览器中,与 SockJS 端点的连接本质上是一个原始的 STOMP 连接。你可以发送和接收标准的 STOMP 帧。

任何优秀的 Javascript STOMP 库都应该能够处理它。在我们的示例中,我们使用了 stomp-websocket 库,由 Jeff MesnilJeff Lindsay 开发。

我们在示例中使用了这段代码

<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script src="stomp.js"></script>
<script>
WebSocketStompMock = SockJS;

var client = Stomp.client('http://127.0.0.1:55674/stomp');
[...]

安装

Rabbitmq-Web-Stomp 是一个实验性插件。它不包含在标准的 RabbitMQ 发布包中;你需要手动安装它。

  1. 你需要至少 Erlang R14 版本(更多信息)。
  2. 你需要安装 Rabbitmq-server 2.8.2
  3. 获取所需的 erlang 插件 .ez 文件
wget \
https://rabbitmq.cn/releases/plugins/v2.8.2-web-stomp-preview/cowboy-0.5.0-rmq2.8.2-git4b93c2d.ez \
https://rabbitmq.cn/releases/plugins/v2.8.2-web-stomp-preview/sockjs-0.2.1-rmq2.8.2-gitfa1db96.ez \
https://rabbitmq.cn/releases/plugins/v2.8.2-web-stomp-preview/rabbitmq_web_stomp-2.8.2.ez \
https://rabbitmq.cn/releases/plugins/v2.8.2-web-stomp-preview/rabbitmq_web_stomp_examples-2.8.2.ez
  1. 接下来,将它们复制到 插件目录。例如,在我的 Ubuntu 机器上,路径如下
sudo cp *.ez /usr/lib/rabbitmq/lib/rabbitmq_server-2.8.2/plugins
  1. 现在,你可以使用 rabbitmq-plugins 启用它们了
sudo rabbitmq-plugins enable rabbitmq_web_stomp
sudo rabbitmq-plugins enable rabbitmq_web_stomp_examples
  1. 重启 rabbitmq 服务器。在 ubuntu 上
sudo /etc/init.d/rabbitmq-server restart

正如你可能注意到的,我们启用了两个插件

请记住,RabbitMQ-web-stomp 依赖于 RabbitMQ-STOMP,后者默认绑定到 61613 端口。

使用方法

如果你启用了 RabbitMQ-web-stomp-examples 插件,你应该能够立即运行我们准备的两个示例。只需在浏览器中打开 http://127.0.0.1:55670/

  • "echo" - 展示了如何使用 STOMP 进行简单的消息广播(源码

  • "bunny" - 一个简单的协作式画布绘图应用示例(源码

总结

RabbitMQ-web-stomp 是一个非常简单的插件,但它通过将 STOMP 协议暴露给浏览器,开启了广阔的可能性。

一如既往,欢迎提供反馈。我们也期待获取更多示例的灵感!

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