EMQ X 分布集群设计

EMQ X 消息服务器集群基于 Erlang/OTP 分布式设计,集群原理可简述为下述两条规则:

  1. MQTT 客户端订阅主题时,所在节点订阅成功后广播通知其他节点:某个主题(Topic)被本节点订阅。
  2. MQTT 客户端发布消息时,所在节点会根据消息主题(Topic),检索订阅并路由消息到相关节点。

EMQ X 消息服务器同一集群的所有节点,都会复制一份主题(Topic) -> 节点(Node)映射的路由表,例如:

  1. topic1 -> node1, node2
  2. topic2 -> node3
  3. topic3 -> node2, node4

主题树(Topic Trie)与路由表(Route Table)

EMQ X 消息服务器每个集群节点,都保存一份主题树(Topic Trie)和路由表。

例如下述主题订阅关系:

客户端节点订阅主题
client1node1t/+/x, t/+/y
client2node2t/#
client3node3t/+/x, t/a

最终会生成如下主题树(Topic Trie)和路由表(Route Table):

image

订阅(Subscription)与消息派发

客户端的主题订阅(Subscription)关系,只保存在客户端所在节点,用于本节点内派发消息到客户端。

例如 client1 向主题’t/a’发布消息,消息在节点间的路由与派发流程:

  1. title: Message Route and Deliver
  2. client1 -> node1: Publish[t/a]
  3. node1 --> node2: Route[t/#]
  4. node2 --> client2: Deliver[t/#]
  5. node1 --> node3: Route[t/a]
  6. node3 --> client3: Deliver[t/a]

image