速率限制

    速率限制是一种 backpressure 方案,从入口处避免了系统过载,保证了系统的稳定和可预测的吞吐。速率限制可在 中配置:

    • max_conn_rate 是单个 emqx 节点上连接建立的速度限制。1000 代表秒最多允许 1000 个客户端接入。
    • conn_messages_in 是单个连接上接收 PUBLISH 报文的速率限制。 代表每个连接上允许收到的最大 PUBLISH 消息速率是每 10 秒 100 个。

    conn_bytes_in 提供的都是针对单个连接的限制,EMQ X 目前没有提供全局的消息速率限制。

    EMQ X 使⽤ 算法来对所有的 Rate Limit 来做控制。 令牌桶算法 的逻辑如下图:

    • 存在一个可容纳令牌(Token) 的最大值 burst 的桶(Bucket),最大值 burst 简记为 b 。
    • 存在一个 rate 为每秒向桶添加令牌的速率,简记为 r 。当桶满时则不不再向桶中加⼊入令牌。
    • 每当有 1 个(或 N 个)请求抵达时,则从桶中拿出 1 个 (或 N 个) 令牌。如果令牌不不够则阻塞,等待令牌的⽣生成。

    由此可知该算法中:

    • 长期来看,所限制的请求速率的平均值等于 rate 的值。

    当使用如下配置做报文速率限制的时候:

    EMQ X 将使用两个值初始化每个连接的 rate-limit 处理器:

    • rate = 100 KB / 10s = 10240 B/s
    • burst = 100 KB = 102400 B

    根据 消息速率限制原理 中的算法,可知:

    • 长期来看允许的平均速率限制为 10240 B/s
    • 允许的峰值速率为 102400 + 10240 = 112640 B/s
    配置项类型默认值描述
    listener.tcp.external.active_nNumber100emqx 每次从 TCP 栈读取多少条消息