慢订阅统计
正常情况下 EMQX 内部消息传输耗时都很低(毫秒级以下),大部分时间消耗都集中在网络传输上,针对客户端偶尔出现订阅消息时延高,EMQX 提供了慢订阅统计功能。
原理
当消息到达 EMQX 后,EMQX 将开始计算完成消息处理以及传输整个流程所消耗的时间(时延)。
如果时延超过阈值,会将对应的订阅者及主题插入或更新到慢订阅列表中,并按照时延高低对列表进行排序。
慢订阅列表:
- 列表中数据按照时延从大到小排名,最多可以记录前 1000 条数据。
- 列表记录的是订阅者-主题数据,而非每一条超过阈值的消息。
- 记录产生时,如果列表中不存在相同记录则将其插入到列表中,否则将更新其发生时间并对整个列表重新排名。
- 记录产生后,有效时长内(默认 300 秒)没有再次触发将被移出统计列表。
消息完成传输的定义:
- QoS 0: 消息成功发出。
- QoS 1: EMQX 收到客户端的 PUBACK 包。
- QoS 2: EMQX 收到客户端的 PUBCOMP 包。
影响消息时延的因素:
- 发布者到 EMQX 网络较慢(暂不能探测,功能规划中)。
- Hooks 执行慢,如 ACL 检查、ExHook、规则引擎等阻塞消息发布流程。
- 队列中消息堆积太多(PUBLISH 与 SUBSCRIBE 共用同一连接,大量 PUBLISH 消息处理不及时/堆积也可能导致 SUBSCRIBE 变慢)导致发出时间超时过慢。
- 订阅者接收速度过慢。
配置并启用慢订阅
打开 EMQX Dashboard,在 问题分析 -> 慢订阅 页面中,点击 开启 即可,如果您已经开启了慢订阅,可以点击右上角 设置 按钮进行阈值和参数设置。
配置参数
时延阈值:用来判断消息是否参与统计,只有时延超过该值的消息才会被记录到慢订阅列表。
最大统计条数:这个字段决定慢订阅列表记录条数,列表仅记录按照时延阈值排名的前 N 条数据,最大 1000 条。
有效时长:每一条记录的有效时间,时长不限,默认 300 秒。记录产生或更新后开始计时,如果在时长范围内,一直没有被再次更新,记录将被清除。
时延统计类型:时延的计算方式,分别为:
- whole:从消息到达 EMQX 时起,直到消息完成传输。
- internal:从消息到达 EMQX 时起,直到消息开始投递。
- response:从消息开始投递时起,直到消息完成传输。
查看慢订阅列表
启用慢订阅后,您可以在 Dashboard 问题分析 -> 慢订阅 页面中查看当前慢订阅列表,列表数据如下:
- 客户端 ID:产生记录的客户端 ID。
- 主题:产生记录的主题。
- 时长:消息时延。
- 节点:记录产生的节点。
- 更新时间:记录产生或更新的时间。
您可点击记录的客户端 ID 进入对应客户端详情页,排查可能导致消息时延较高的原因。