EMQ X 速率限制(Rate Limit)配置指南


在閱讀該指南之前,假定你已經了解 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_limitrate_limit 都使用 令牌桶算法 實現,其算法邏輯如下圖:

  1. 存在一個最多可容納 burst 數量令牌 (Token) 的桶 (Bucket)。
  2. 我們將以每秒 N 個的速率向這個桶添加令牌,桶滿時則不再向桶添加令牌,這個速率我們記為 rate
  3. 每當有請求抵達,則從桶中取出相應數量的令牌。如果桶為空則阻塞,直到足夠數量的令牌被放入。

作用

通過 令牌桶 算法,我們能夠:

  • 在長時間運行的情況下,被限制的請求速率的平均值等於令牌添加的速率,即 rate
  • 允許一定程度的峰值流量。如果請求速度為 M,且大於 rate,則令牌減少的速率為 M - rate,那么一個滿的桶被取完令牌需要的時間為 burst / (M - rate),而在此期間接受的請求數量為 burst / (M - rate) * M

總之,可以簡單理解 rate 為平均請求速率,burst為瞬間最大請求速率。

EMQ X 速率限制實現

基於以上的 令牌桶 算法下,EMQ X 對速率限制的實現邏輯如下:

其含義為:

  1. socket 每接收 n 個 TCP 數據報文,便進行一次速率檢查,將收到的 n 個 TCP 數據報文的總長度記為 s。
  2. 令牌桶中的剩余令牌數大於等於 s,則更新對應令牌桶的令牌數量,並繼續激活 socket 執行 active_n。
  3. 令牌桶中的剩余令牌數 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 原創,轉載請注明出處。

原文鏈接:https://www.emqx.io/cn/blog/emqx_rate_limit


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM