emqx topic 性能分析

EMQX 路由性能分析

一、背景

在物联网(IoT)和消息驱动系统中,MQTT Broker 的路由性能直接决定了系统的吞吐能力、延迟表现以及可扩展性。EMQX 作为一款高性能、分布式 MQTT Broker,被广泛应用于百万级甚至千万级连接场景。

在实际生产环境中,随着以下因素的增长,路由性能问题逐渐凸显:

  • 客户端连接数急剧增加(10 万 ~ 百万级)
  • Topic 层级复杂、通配符订阅(+ / #)大量存在
  • QoS 1 / QoS 2 消息比例提升
  • 规则引擎、桥接(Bridge)、共享订阅等高级功能引入

因此,有必要对

二、目标

本文档的目标包括:

  1. 理解 EMQX 的路由原理
    • Topic 路由是如何构建和匹配的
    • 通配符订阅在内部如何表示
  2. 分析路由性能的关键影响因素
    • 订阅规模、Topic 深度、通配符数量
    • ETS / Trie 等核心数据结构的作用
  3. 结合实际场景评估性能瓶颈
    • 单节点 vs 集群
    • 发布路径(Publish Path)与订阅路径(Subscribe Path)
  4. 给出优化建议与最佳实践
    • Topic 设计建议
    • 订阅模型优化方向

三、EMQX 路由整体原理

3.2 EMQX 的路由核心组件

EMQX 的 Topic 路由主要由以下组件构成:

  • Topic Trie(前缀树)
  • ETS(Erlang Term Storage)表
  • emqx_trie / emqx_router 等内部模块

四、Topic Trie 路由机制

4.1 Trie 结构简介

Trie(前缀树)是一种非常适合用于 分层 Topic 匹配 的数据结构:

示例 Topic:

t/tenant1/device1/up/data

拆分为层级:

[t] -> [tenant1] -> [device1] -> [up] -> [data]

每一层对应 Trie 中的一个节点。

五、路由性能关键路径分析

5.1 订阅路径(Subscribe Path)

订阅时主要消耗在:

  • Topic 拆分与规范化
  • Trie 节点创建 / 查找
  • ETS 表写入

特点:

  • 订阅是低频操作
  • 更关注内存占用,而非极致性能

5.2 发布路径(Publish Path)

发布路径是性能最关键部分

  1. Topic 拆分
  2. Trie 深度优先 / 广度优先遍历
  3. 通配符匹配

特点:

  • 高频操作
  • 对延迟和 CPU 极其敏感

总结:

  • emqx 基于有序 Trie + 类似Skip List 的扫描模型
  • EMQX 是在 “有序的订阅过滤器集合”上做“带跳跃的顺序遍历(ordered scan + seek)”
  • 精准匹配 + Trie通配符匹配树两种都要走
  • 对于Trie通配符匹配,每层递归遍历,使用二分法跳跃寻找下一个目标层级

六、影响路由性能的主要因素

6.1 订阅规模

  • 订阅数越多,Trie 节点越多
  • ETS 表占用内存线性增长

百万级订阅是性能分水岭