有没有 MQTT 高可用负载均衡方案

2024-03-08 20:13:48 +08:00
 laters

目前设备连接 MQTT ,多个 MQ server 后台不清楚设备具体连接到了哪个 server 上,导致推送时不知道使用哪个 server 推送消息给设备

有没有 MQTT 高可用、负载均衡方案

7017 次点击
所在节点    程序员
40 条回复
l0wkey
2024-03-09 10:14:06 +08:00
firechat
2024-03-09 10:20:21 +08:00
用 redis 记录一下设备连的节点,推送时查一下
cdlnls
2024-03-09 10:35:27 +08:00
用过 emqx ,还是挺好用的,这个在集群模式下,往任意一个节点推送消息,集群内会自己转发消息到对应的节点。
如果没有集群的话就难搞了,让客户端在连接之前,告诉服务端连了那个节点,然后服务端在发送消息的时候查询一下记录。

感觉你这种方案很奇怪,几个 mqtt server 都是相互独立的,假如多个设备连上不同的 server ,这个时候假如设备都订阅了同一个 topic ,你还是要给每个节点发送一次消息。
xylophone21
2024-03-09 11:21:38 +08:00
@laters 有这个问题是因为你的两个 Broker 没有组成集群,这要看你问题规模.
1. 如果规模小,就建集群,往哪个 broker 发另一个都能收到的.你可以想象成 Client A 连接了 Broker A,订阅了 a topic, B 连 B,然后给 a topic 发 pub. 问题是集群是有上限和代价的,特别是社区版.
2. 如果规模大,集群搞不定或者不想买商业版,那就自己控制路由.设备连 Broker 之前,通过接口拿到节点的域名(如何分配看你的业务),然后再连接.这样 Broker 之间没有联系,集群规模的大小就只受你业务能力的限制.当然,为了高可用,实际上你的每个节点还是一个小集群,但这是另外一个故事.
xylophone21
2024-03-09 11:26:01 +08:00
这样做有一个限制,就是设备和设备之间的互发消息必须少,而且需要你通过业务来转发实现.如果这种转发太多且无规律,实际上你就是一个 Broker 集群了. 一般来说,需要通过你的业务来简化这个模型.比如一般的物联网场景下,设备和设备之间是不需要相互发消息的,但如果你有网关类设备,就又不一样了,需要特殊处理.
wanniwa
2024-03-09 11:32:51 +08:00
开源中国我记得首页经常有个 mqtt 的一个项目更新的消息,可以去搜搜。
Curtion
2024-03-09 12:12:43 +08:00
emqx , 集群一下就行了
laters
2024-03-09 12:54:42 +08:00
@xylophone21 #24 感谢
laters
2024-03-09 12:55:55 +08:00
@mango88 是的
laters
2024-03-09 12:56:07 +08:00
@xiyou007 #19 有吗, 是不是有限制啊
laters
2024-03-09 12:57:05 +08:00
@cdlnls 是的,现在就是没办法知道设备连接到了哪个 server 上,,目前的做法是所有的 MQTT server 都推送消息。
laters
2024-03-09 12:58:06 +08:00
@Curtion 但我看是商业版,免费的可以做到吗
laters
2024-03-09 12:59:05 +08:00
@wanniwa mica-mqtt 吗?
laters
2024-03-09 12:59:35 +08:00
@xylophone21 #24 主要是对于公司而言,不太想买商业版
vultr
2024-03-09 14:11:23 +08:00
如果你用的是 mosquitto ,写个程序分析日志,根据用户上线下线事件,把信息写回到后端 api 就解决了。
merryCodeing
2024-03-09 14:42:34 +08:00
@laters 为什么不是用域名+端口( 1883 | 8883 )连接呢? 我们现在就是 emqx + nginx 搭建的集群,设备端监听了 topic ,一般 topic 都有设备信息,设备端怎么会收不到呢
laters
2024-03-09 14:52:57 +08:00
@ITdream emqx 是免费版还是商业版 ?
isnullstring
2024-03-09 15:17:54 +08:00
有点奇怪的思路,既不想付费上成熟的商业 MQ ,免费的也不知道有没有坑

按 24 楼 的做法 自己做 Server 之间消息中转 对付下 应该没什么毛病,请求多的话还是上付费版吧
cnhongwei
2024-03-09 17:19:42 +08:00
我使用的是开源的 artemis 服务器,看文档说是可以群集,你可以试试。
https://activemq.apache.org/components/artemis/documentation/latest/clusters.html#clusters
cheng6563
2024-03-09 19:55:14 +08:00
这问题说容易也容易,给设备定多个 MQTT server 地址而不是用反代做负载均衡,设备根据自己的 SN 取模后连固定的某台 MQTT server 。
后台发消息也是根据同样的规则找到对应 MQTT server 去。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021963

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX