RabbitMQ前端通讯
简介
RabbitMQ默认通讯协议是AMQP只能与后端通讯RabbitMQ与前端通讯需要使用自带的RabbitMQ Web STOMP 插件或RabbitMQ Web MQTT 插件- 官方文档
https://rabbitmq.cn/docs/web-mqtt(看英文原版把.cn改.com) - 两个插件使用方法相似, 本篇教程使用更稳定的
MQTT作为样例
启用脚本
执行以下命令:
1 | |
此命令等价于在 /etc/rabbitmq/enabled_plugins 中 在数组里新增 rabbitmq_web_mqtt 完成后文件内容看起来是这样:
1 | |
检测是否生效
执行以下命令查看所有插件:
1 | |
预期运行结果:
1 | |
前端连接
前端需要引用 mqtt 包, 项目的 package.json 看起来像是这样:
1 | |
示例代码 (react) (官方js示例详见https://rabbitmq.cn/docs/web-mqtt#usage):
1 | |
扩展内容
虚拟主机 (详见 https://rabbitmq.cn/docs/mqtt#virtual-hosts)
虚拟主机作为用户名的一部分
连接时指定
vhost的另一种更具体的方法是将vhost预先添加到用户名,并用冒号分隔。例如,使用以下方式连接
1 | |
- 等效于默认 vhost 和用户名,而
1 | |
表示连接到
vhost mqtt-host,用户名为mqtt-username。在用户名中指定虚拟主机优先于使用
mqtt_port_to_vhost_mapping全局参数指定的端口到vhost的映射。
主题订阅的差异 (详见 https://rabbitmq.cn/docs/mqtt#topic-level-separator-and-wildcards)
主题级别分隔符和通配符
MQTT 协议规范定义斜杠 (“/”) 为 主题级别分隔符,而 AMQP 0-9-1 定义点 (“.”) 为主题级别分隔符。此插件在后台转换模式以桥接两者。
例如,MQTT 主题 cities/london 变为 AMQP 0.9.1 主题 cities.london,反之亦然。因此,当 MQTT 客户端发布主题为 cities/london 的消息时,如果 AMQP 0.9.1 客户端想要接收该消息,则应从其队列创建到主题交换机的绑定,绑定键为 cities.london。
反之亦然,当 AMQP 0.9.1 客户端发布主题为 cities.london 的消息时,如果 MQTT 客户端想要接收该消息,则应创建主题过滤器为 cities/london 的 MQTT 订阅。
这有一个重要的限制:主题中包含点的 MQTT 主题将无法按预期工作,应避免使用,同样适用于包含斜杠的 AMQP 0-9-1 路由和绑定键。
此外,MQTT 定义加号 (“+”) 为 单级别通配符,而 AMQP 0.9.1 定义星号 (“*”) 以匹配单个单词
| MQTT | AMQP 0.9.1 | 描述 |
|---|---|---|
| / | . | 主题级别分隔符 |
| + | * | 单级别通配符(匹配单个单词) |
| # | # | 多级别通配符(匹配零个或多个单词) |
编码
mqtt传输UTF-8的二进制格式, 后端用AMQP接收之后要转码
RabbitMQ部署参考
1 | |