1. EMQ的使用
1.1. 如何搭建集群?
下载软件包,在不同的机器上。
修改文件\etc\emqx.conf 的node.name = emqx@192.168.1.47
,后面跟的一定要是本机域名,一定要相同如果不同会导致join出错。
client端clientid参数是关键,本地不同的clientid会导致新的链接
实现离线消息:
但是有最大队列数量,不多1000。
// MQTT的连接设置 options = new MqttConnectOptions(); // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 options.setCleanSession(false);
1.2. EMQ集群是如何工作的?
相互互联 EMQ集群是相互互联的。因为长连接是有状态的(也就是说长连接是有状态的),所以需要找到对应推送的长连接才行。
共享订阅与发布信息 mqtt协议是基于发布订阅模式实现长连接的 推拉消息的。
如何共享订阅与发布信息? 假设有mqtt服务器4台(m1,m2,m3,m4)
- 所有节点都有相同的(所有订阅节点的总和)一份订阅树
- 所有订阅树上绑定着对应的节点(哪些订阅是属于哪些节点的),
- 由接受到的消息的服务器进行转发
具体发布订阅流程:
- 订阅消息
- client1订阅
topic/client1
,client1所在节点订阅成功后,广播给其他server(m2,m3,m4) - 所以集群中不仅有订阅树,还有一个订阅URL与节点的路由表
- client1订阅
- 发布消息
- 在找到与之匹配的topic,并且根据路由表找到对应的server,并广播
1.3. EMQ集群测试
- 集群两节点自动断开会自动断开
- 当两边任意一个断网时,集群会断开链接
- client端会自动断开
- 客户端可以通过编码的方式,维护一个长连接不断线
2. EMQ桥接模式与集群模式的区别
桥接模式:顾名思义 连接两个MQTT broker。
并且是定向的。
只能从一方->另一方
需要配置好。
疑问:
- 那么如果发送的一方挂掉了,那么不就桥接模式就断掉了吗?
- 如果多个桥接会不会有问题,比如说两个集群A,B。A中多个broker桥接到B集群中不同(或者相同的)的broker上会不会出现消息重发的现象
3. EMQ高级使用
在官方文档中有一个规则的使用,当时我一直不知道这个有什么用处。
直到后来思考IM业务的时候,才发现这个规则有巨大的用处。简单说这个规则就是定义一个特定的规则,当某个topic有消息传输时,接下来可以自定义动作要做的事情,仔细想想所有业务也逃不过这些操作,要么是操作数据库,要么是操作一段业务,而业务的话可以使用HTTP,如果是发送其他信息,可以直接配置。
这样想象空间就大很多。
4. 小问题
- 集群情况下如何监控每个节点与集群的健康关系
- 集群配置,每台设备都是一样,但是好像需要单独配置
- 数据库存储
- 消息业务操作钩子