Skip to content

レートリミッターの設定

リミッターはEMQX 5.0で導入された新機能で、クライアントまたはトピックが指定された時間内にパブリッシュまたはサブスクライブできるメッセージ数を制限する仕組みです。リミッターの詳細や動作については、Rate Limitを参照してください。

リスナー単位のリミッター

リミッターはリスナー単位で動作させることができます。EMQXでは以下の種類のリミッターを用いてレート制限を指定します。

種類ダッシュボードUI説明オーバーロード時の動作
bytes_rateクライアントごとの最大メッセージパブリッシュトラフィック1秒あたりに単一クライアントがパブリッシュするメッセージのバイト数。クライアントからのメッセージ受信を一時停止
bytes_burstクライアントごとの最大メッセージパブリッシュバースト通常のData Publishing Rateに基づく、単一クライアントがバーストで送信可能なバイト数。クライアントからのメッセージ受信を一時停止
messages_rateクライアントごとの最大メッセージパブリッシュレート1秒あたりに単一クライアントがパブリッシュするメッセージ数。クライアントからのメッセージ受信を一時停止
messages_burstクライアントごとの最大メッセージパブリッシュバースト通常のMessages Publish Rateに加え、単一クライアントがバーストで送信可能なメッセージ数。クライアントからのメッセージ受信を一時停止
max_conn_rateリスナーごとの最大接続レート現在のリスナーに対する1秒あたりの接続数。新規接続の受け入れを一時停止
max_conn_burstリスナーごとの最大接続バーストリスナーがバーストで受け入れ可能な最大接続数。新規接続の受け入れを一時停止

配信レートリミッターは同じくリスナー単位で動作しますが、オーバーロード時の動作が異なります。詳細は配信レートリミッターを参照してください。

例えば、デフォルトのTCPリスナーにリミッターを設定する場合、以下のように設定します。

bash
listeners.tcp.default {
  bind = "0.0.0.0:1883"
  max_conn_rate = "1000/s"
  max_conn_burst = "10000/60m"
  messages_rate = "1000/s"
  messages_burst = "10000/60m"
  bytes_rate = "1MB/s"
  bytes_burst = "100MB/60m"
}

この設定は以下を意味します。

  • リスナーの接続確立の最大レートは1秒あたり1000接続。
  • リスナーは60分間に最大10,000接続を受け入れ可能。
  • クライアントごとのメッセージパブリッシュ最大レートは1秒あたり1000メッセージ。
  • リスナーは60分ごとに短期間で最大10,000メッセージのバーストを許容。
  • クライアントごとのデータパブリッシュ最大レートは1秒あたり1MB。
  • リスナーは60分ごとに短期間で最大100MBのバーストを許容。

ノード単位のリミッター

リミッターはノード単位でも動作し、各EMQXノードへの個々のクライアント接続の速度や、ノードにパブリッシュされるメッセージやデータのレートを制限します。EMQXノードでは以下の種類のリミッターを用いてレート制限を指定します。

種類ダッシュボードUI説明オーバーロード時の動作
bytes_rateデータパブリッシュレート単一クライアントが各EMQXノードにパブリッシュするデータ量(バイト単位)。制限に達すると、EMQXはQoS 0メッセージを破棄し、QoS 1およびQoS 2メッセージを「Quota Exceeded」エラー(0x97)で拒否します。
bytes_burstデータパブリッシュバースト通常のdata publish rateに基づくクライアントごとのバースト許容量。制限に達すると、EMQXはQoS 0メッセージを破棄し、QoS 1およびQoS 2メッセージを「Quota Exceeded」エラー(0x97)で拒否します。
messages_rateメッセージパブリッシュレート単一クライアントが各EMQXノードにメッセージをパブリッシュするレート。制限に達すると、EMQXはQoS 0メッセージを破棄し、QoS 1およびQoS 2メッセージを「Quota Exceeded」エラー(0x97)で拒否します。
messages_burstメッセージパブリッシュバースト通常のmessage publishing rateに基づくノードごとのバースト許容量。制限に達すると、EMQXはQoS 0メッセージを破棄し、QoS 1およびQoS 2メッセージを「Quota Exceeded」エラー(0x97)で拒否します。
max_conn_rate最大接続レートノードごとに受け入れる新規接続のレート。制限に達すると、EMQXはAcceptキューでの接続処理を一時停止し、新規接続の遅延または拒否を行います。
max_conn_burst最大接続バーストノードがバーストで受け入れ可能な最大接続数。新規接続の受け入れを一時停止

例えば、EMQXノードにリミッターを設定するには、emqx.confで以下のように設定します。

bash
mqtt.limiter {
  max_conn_rate = "1000/s"
  max_conn_burst = "10000/60m"
  messages_rate = "500/10s"
  messages_burst = "10000/60m"
  bytes_rate = "500KB/s"
  bytes_burst = "100MB/60m"
}

ゾーン単位のリミッターはzoneセクション内に以下のように埋め込むことができます。

bash
zones.my_zone.mqtt {
  limiter {...}
}
  • ノードは10秒ごとに最大500メッセージを受信でき、それを超えるメッセージは破棄または拒否されます。
  • ノードは60分ごとに短期間で最大10,000メッセージのバーストを許容します。
  • ノードは10秒ごとに最大500MBのデータを受信でき、それを超えるデータは破棄または拒否されます。
  • ノードは60分ごとに短期間で最大100MBのバーストを許容します。

配信レートリミッター

上記のパブリッシュ側リミッターに加え、EMQXはサブスクライブ側の配信レート制限もサポートしています。これらのリミッターは、どのクライアントがパブリッシュしたかにかかわらず、EMQXがサブスクライブクライアントにメッセージを配信する速度を制御します。

種類ダッシュボードUI説明オーバーロード時の動作
delivery_messages_rateクライアントごとの最大メッセージ配信レートノードごとに単一サブスクライバーに配信されるメッセージの最大レート。QoS 0メッセージは破棄されます。QoS 1およびQoS 2メッセージは内部キューに入れられ、リミッター設定に基づく遅延後に再試行されます。
delivery_messages_burstクライアントごとの最大メッセージ配信バーストdelivery_messages_rateに加えたバースト許容量。上記と同様。
delivery_bytes_rateクライアントごとの最大メッセージ配信トラフィックノードごとに単一サブスクライバーに配信されるデータの最大レート(バイト単位)。上記と同様。
delivery_bytes_burstクライアントごとの最大メッセージ配信トラフィックバーストdelivery_bytes_rateに加えたバースト許容量。上記と同様。

パブリッシュ側リミッターと異なり、配信リミッターはチャネル単位でのみ適用され、ゾーンやリスナーグループ間で共有されません。

TIP

配信レートリミッターはメモリーセッション(durable_sessions.enable = false)でのみサポートされます。永続化セッションが有効な場合は効果がありません。

ダッシュボードの管理 -> リスナーページで各リスナーの配信レート制限を設定できます。

または、設定ファイルで設定することも可能です。例えば、デフォルトのTCPリスナーに配信レート制限を設定するには、emqx.confに以下のように記述します。

bash
listeners.tcp.default {
  bind = "0.0.0.0:1883"
  delivery_messages_rate = "100/s"
  delivery_messages_burst = "500/10s"
  delivery_bytes_rate = "1MB/s"
  delivery_bytes_burst = "10MB/10s"
}

未指定の場合、デフォルト値はinfinityとなり、後方互換性が維持されます。

TIP

EMQXはカスタマイズニーズに対応するため、さらに多くの設定項目を提供しています。詳細はEMQX Enterprise Configuration Manual for Enterpriseを参照してください。