# 慢订阅统计

正常情况下 EMQX 内部消息传输耗时都很低（毫秒级以下），大部分时间消耗都集中在网络传输上，针对客户端偶尔出现订阅消息时延高，EMQX 提供了慢订阅统计功能。

## 原理

当消息**到达 EMQX** 后，EMQX 将开始计算完成消息处理以及传输整个流程所消耗的时间（时延）。

如果时延超过阈值，会将对应的**订阅者及主题**插入或更新到**慢订阅列表**中，并按照时延高低对列表进行排序。

慢订阅列表：

- 列表中数据按照时延从大到小排名，最多可以记录前 1000 条数据。
- 列表记录的是**订阅者-主题**数据，而非每一条超过阈值的消息。
- 记录产生时，如果列表中不存在相同记录则将其插入到列表中，否则将更新其发生时间并对整个列表重新排名。
- 记录产生后，有效时长内（默认 300 秒）没有再次触发将被移出统计列表。

消息完成传输的定义：

- QoS 0: 消息成功发出。
- QoS 1: EMQX 收到客户端的 PUBACK 包。
- QoS 2: EMQX 收到客户端的 PUBCOMP 包。

影响消息时延的因素：

- 发布者到 EMQX 网络较慢（暂不能探测，功能规划中）。
- Hooks 执行慢，如 ACL 检查、ExHook、规则引擎等阻塞消息发布流程。
- 队列中消息堆积太多（PUBLISH 与 SUBSCRIBE 共用同一连接，大量 PUBLISH 消息处理不及时/堆积也可能导致 SUBSCRIBE 变慢）导致发出时间超时过慢。
- 订阅者接收速度过慢。

## 配置并启用慢订阅

<!-- TODO 补充配置文件配置方式，目前该方式有 BUG 暂时不在文档中提供。 -->

打开 EMQX Dashboard，在 **问题分析** -> **慢订阅** 页面中，点击 **开启** 即可，如果您已经开启了慢订阅，可以点击右上角 **设置** 按钮进行阈值和参数设置。

![EMQX 慢订阅](./assets/slow_subscribers_statistics_1.png)

### 配置参数
<!-- 
Stats Threshold
Maximum Number of Statistics
Eviction Time of Record
Stats Type:
    whole : The total time the delivery was completed
    internal : EMQX internal transfer time
    response : Client response time
 -->

- 时延阈值：用来判断消息是否参与统计，只有时延超过该值的消息才会被记录到慢订阅列表。

- 最大统计条数：这个字段决定慢订阅列表记录条数，列表仅记录按照时延阈值排名的前 N 条数据，最大 1000 条。

- 有效时长：每一条记录的有效时间，时长不限，默认 300 秒。记录产生或更新后开始计时，如果在时长范围内，一直没有被再次更新，记录将被清除。

- 时延统计类型：时延的计算方式，分别为:
  - whole：从消息到达 EMQX 时起，直到消息完成传输。
  - internal：从消息到达 EMQX 时起，直到消息开始投递。
  - response：从消息开始投递时起，直到消息完成传输。

## 查看慢订阅列表

启用慢订阅后，您可以在 Dashboard **问题分析** -> **慢订阅** 页面中查看当前慢订阅列表，列表数据如下：

- 客户端 ID：产生记录的客户端 ID。
- 主题：产生记录的主题。
- 时长：消息时延。
- 节点：记录产生的节点。
- 更新时间：记录产生或更新的时间。

![EMQX 慢订阅记录](./assets/slow_subscribers_statistics_3.png)

您可点击记录的**客户端 ID** 进入对应客户端详情页，排查可能导致消息时延较高的原因。

![EMQX 客户端详情](./assets/slow_subscribers_statistics_4.png)
