MQTT协议在topic设计上的想法
- 集群方式使用EMQTT的方案:http://emqtt.com/docs/v2/cluster.html
- 假设有异地多中心
- 假设EMQTT的node节点之前有数据的分发
问题:
按照上面文档说明的路由表的方案的话,在每个节点都订阅#的话可能会导致一条消息被路由多于1次。
论证:
假设集群中有两台机器A、B,
A维护sub Topic:A1、A2
B维护sub Topic:B1、B2
在A、B分别订阅#,那么在B上pub topic A1的情况下,B会将改消息路由给A,实际上B、A收到了重复了一条消息。
解决方案:
在一些场景上需要为topic设计前缀,前缀设计方案:
* 负载单元,每台机器的负载能力不一致,可以设计A机器的负载单位数量为3,B机器的负载单位为2,此时A机器应该有/A1/、/A2/、/A3/,B应该有/B1/、/B2/;
按照业务划分,例如:厂商、地区、聊天室;
如果上面猜测为实际的话,对于系统的负载和逻辑都有很大的影响,那么解决方案为
topic的设计方式:
A维护sub topic为A/A1、A/A2
B维护sub topic为B/B1、B/B2
在A上sub topic为A/#
在B上sub topic为B/#
* 也可以只在A或者B上sub #,不推荐这种方式
集群中使用auth插件,auth插件的数据驱动为Redis、MySQL的话,可以使用同一个数据库。