在閱讀該指南之前,假定你已經了解 MQTT 與 EMQ X MQTT 服務器 的簡單知識。
EMQ X Broker 從 V3 版本開始支持速率限制功能,包括了對 PUBLISH 報文接收速率 與 TCP 數據包接收速率 的限制,本文將詳細介紹該功能的配置與使用。
配置項
MQTT PUBLISH 報文接收速率
該配置位於 emqx.conf
:
zone.external.publish_limit = 10,1m
配置格式為:<Number>,<Duration>
,表示在 <Duration>
時間段內,最多允許接收 <Number>
數量的 PUBLISH 報文。
TCP 數據包接收速率
該配置位於 emqx.conf
:
listener.tcp.external.rate_limit = 1024,4096
配置格式為:<Rate>,<Burst>
,它表示允許的數據包接收的平均速率為 <Rate>
。但它允許的的最大峰值由 <Burst>
值決定。詳細的內容見下節: 速率限制算法令牌桶 — 算法
active_n
該配置位於 emqx.conf
:
listener.tcp.external.active_n = 100
active_n
實際上表示的是:在底層的異步 I/O 中允許讀取的數據報條數,每當異步的讀操作到達該限制時,便暫時的切換為同步模式。每當切換為同步模式時,則會執行一次速率限制的檢查。因此,該值越大,系統的吞吐性能越好;該值越小,速率檢查越精准,流入的流量越平穩,系統的安全性更高。
速率限制算法 - 令牌桶
簡介
上述所提到 publish_limit
和 rate_limit
都使用 令牌桶算法 實現,其算法邏輯如下圖:
- 存在一個最多可容納
burst
數量令牌 (Token) 的桶 (Bucket)。 - 我們將以每秒 N 個的速率向這個桶添加令牌,桶滿時則不再向桶添加令牌,這個速率我們記為
rate
。 - 每當有請求抵達,則從桶中取出相應數量的令牌。如果桶為空則阻塞,直到足夠數量的令牌被放入。
作用
通過 令牌桶 算法,我們能夠:
- 在長時間運行的情況下,被限制的請求速率的平均值等於令牌添加的速率,即
rate
。 - 允許一定程度的峰值流量。如果請求速度為
M
,且大於rate
,則令牌減少的速率為M - rate
,那么一個滿的桶被取完令牌需要的時間為burst / (M - rate)
,而在此期間接受的請求數量為burst / (M - rate) * M
。
總之,可以簡單理解 rate
為平均請求速率,burst
為瞬間最大請求速率。
EMQ X 速率限制實現
基於以上的 令牌桶 算法下,EMQ X 對速率限制的實現邏輯如下:
其含義為:
- socket 每接收 n 個 TCP 數據報文,便進行一次速率檢查,將收到的 n 個 TCP 數據報文的總長度記為 s。
- 令牌桶中的剩余令牌數大於等於 s,則更新對應令牌桶的令牌數量,並繼續激活 socket 執行 active_n。
- 令牌桶中的剩余令牌數 r 小於 s,則等待
(s - r) / rate
秒再激活 socket。
速率限制配置示例
速率限制配置
listener.tcp.external.active_n = 100
listener.tcp.external.rate_limit = 1024,1024000
以上配置表示:
- 每收到 100 個 TCP 報文進行速率檢查。
- 平均速率限制為 1024 byte/s。
- 桶大小為 1000 KB,如果這 100 個 TCP 報文的總長度大於 1000KB,那么將會觸發速率限制。
因此,用戶需要根據實際報文大小來設置 <Burst>
, EMQ X 推薦配置為 (max_packet_size * active_n) / 2
,以避免頻繁發生阻塞。
listener.tcp.external.active_n = 100
zone.external.publish_limit = 10,1m
以上配置表示:
- 每收到 100 個 TCP 報文進行速率檢查。
- 1 分鍾內僅允許接收 10 個 PUBLISH 報文。
可以將 <Number>,<Duration>
轉換為 <Rate>,<Burst>
的形式,即 <Number> / <Duration>, <Numebr>
。
其他配置
此外,除了這以上的 Rate Limit 限制外,在 etc/emqx.conf
配置中,還支持對 TCP、WebSocket 等連接進行以下限制:
listener.tcp.external.max_connections = 1024000
允許同時存在的最大連接數量,即最大同時在線客戶端數量。
listener.tcp.external.max_conn_rate = 1000
每秒允許的最大並發連接數。
版權聲明: 本文為 EMQ 原創,轉載請注明出處。