emqx topic 性能分析
EMQX 路由性能分析
一、背景
在物联网(IoT)和消息驱动系统中,MQTT Broker 的路由性能直接决定了系统的吞吐能力、延迟表现以及可扩展性。EMQX 作为一款高性能、分布式 MQTT Broker,被广泛应用于百万级甚至千万级连接场景。
在实际生产环境中,随着以下因素的增长,路由性能问题逐渐凸显:
- 客户端连接数急剧增加(10 万 ~ 百万级)
- Topic 层级复杂、通配符订阅(
+/#)大量存在 - QoS 1 / QoS 2 消息比例提升
- 规则引擎、桥接(Bridge)、共享订阅等高级功能引入
因此,有必要对
二、目标
本文档的目标包括:
- 理解 EMQX 的路由原理
- Topic 路由是如何构建和匹配的
- 通配符订阅在内部如何表示
- 分析路由性能的关键影响因素
- 订阅规模、Topic 深度、通配符数量
- ETS / Trie 等核心数据结构的作用
- 结合实际场景评估性能瓶颈
- 单节点 vs 集群
- 发布路径(Publish Path)与订阅路径(Subscribe Path)
- 给出优化建议与最佳实践
- 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)
发布路径是性能最关键部分:
- Topic 拆分
- Trie 深度优先 / 广度优先遍历
- 通配符匹配
特点:
- 高频操作
- 对延迟和 CPU 极其敏感
总结:
- emqx 基于有序 Trie + 类似Skip List 的扫描模型
- EMQX 是在 “有序的订阅过滤器集合”上做“带跳跃的顺序遍历(ordered scan + seek)”。
- 精准匹配 + Trie通配符匹配树两种都要走
- 对于Trie通配符匹配,每层递归遍历,使用二分法跳跃寻找下一个目标层级
六、影响路由性能的主要因素
6.1 订阅规模
- 订阅数越多,Trie 节点越多
- ETS 表占用内存线性增长
百万级订阅是性能分水岭。