Skip to content

レートリミッターの設定 ​

EMQX 5.0で導入されたレートリミッターは、接続レートやクライアントがメッセージをパブリッシュおよび受信する速度、データ転送速度、SUBSCRIBEパケットの送信速度を制御します。レートリミッターの詳細や動作については、レートリミットを参照してください。

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

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

種類ダッシュボードUI説明オーバーロード時の動作
bytes_rateクライアントごとの最大メッセージパブリッシュトラフィック単一クライアントが1秒あたりにパブリッシュするメッセージのバイト数。クライアントからのメッセージ受信を一時停止。
bytes_burstクライアントごとの最大メッセージパブリッシュバースト通常のData Publishing Rateに基づく、単一クライアントが一時的に送信可能なバイト数。クライアントからのメッセージ受信を一時停止。
messages_rateクライアントごとの最大メッセージパブリッシュレート単一クライアントが1秒あたりにパブリッシュするメッセージ数。クライアントからのメッセージ受信を一時停止。
messages_burstクライアントごとの最大メッセージパブリッシュバースト通常のMessages Publish Rateに加えて、単一クライアントが一時的に送信可能なメッセージ数。クライアントからのメッセージ受信を一時停止。
subscribes_rateサブスクライブレートクライアント接続が設定された間隔内に送信可能なSUBSCRIBEパケットの最大数。パケットを処理せず、サブスクリプションも作成しません。各トピックフィルターごとにSUBACKで失敗コードを返します。
subscribes_burstサブスクライブバーストクライアント接続が一時的に送信可能な追加のSUBSCRIBEパケット数。上記と同様の動作。
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"
  subscribes_rate = "120/1m"
  subscribes_burst = "10/10s"
  bytes_rate = "1MB/s"
  bytes_burst = "100MB/60m"
}

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

  • リスナーでの接続確立の最大レートは1秒あたり1000接続です。
  • リスナーは60分間に最大10,000接続まで受け入れ可能です。
  • クライアントごとのメッセージパブリッシュ最大レートは1秒あたり1000メッセージです。
  • リスナーは60分ごとに短時間で最大10,000メッセージのバーストを許容します。
  • 各クライアントは1分あたり最大120のSUBSCRIBEパケットを送信可能で、10秒ごとに最大10パケットの追加バーストが許可されます。
  • クライアントごとのデータパブリッシュ最大レートは1秒あたり1MBです。
  • リスナーは60分ごとに短時間で最大100MBのバーストを許容します。

サブスクライブパケットのレート制限は各クライアント接続ごとに独立して適用されます。リミッターはパケット数をカウントし、トピックフィルター数ではありません。制限に達した場合、EMQXはパケットを処理せずサブスクリプションも作成しませんが、クライアント接続は維持されます。MQTT 5.0では、EMQXはパケット内の各トピックフィルターに対してQuota Exceeded理由コード(0x97)を含むSUBACKを返します。MQTT 3.xでは、SUBACKの失敗コード(0x80)を返します。

subscribes_rateのデフォルト値はinfinityで、制限は無効です。マネージドネームスペースに設定すると、ネームスペース単位のサブスクライブパケットレート制限がリスナー単位の制限に優先して適用されます。

ノード単位のリミッター ​

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

種類ダッシュボードUI説明オーバーロード時の動作
bytes_rateデータパブリッシュレート単一クライアントが各EMQXノードにパブリッシュするデータ量(バイト単位)。制限に達すると、QoS 0メッセージは破棄され、QoS 1およびQoS 2メッセージは「Quota Exceeded」エラー(0x97)で拒否されます。
bytes_burstデータパブリッシュバースト通常のdata publish rateに基づく、クライアントごとに許可されるバーストデータ量。制限に達すると、QoS 0メッセージは破棄され、QoS 1およびQoS 2メッセージは「Quota Exceeded」エラー(0x97)で拒否されます。
messages_rateメッセージパブリッシュレート単一クライアントが各EMQXノードにパブリッシュするメッセージのレート。制限に達すると、QoS 0メッセージは破棄され、QoS 1およびQoS 2メッセージは「Quota Exceeded」エラー(0x97)で拒否されます。
messages_burstメッセージパブリッシュバースト通常のmessage publishing rateに基づく、ノードごとに許可されるメッセージのバースト数。制限に達すると、QoS 0メッセージは破棄され、QoS 1およびQoS 2メッセージは「Quota Exceeded」エラー(0x97)で拒否されます。
max_conn_rate最大接続レートノードごとに受け入れ可能な新規接続のレート。制限に達すると、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クライアントごとの最大メッセージ配信トラフィック単一サブスクライバーに対してノードごとに配信されるデータの最大レート(バイト単位)。QoS 0メッセージは破棄されます。QoS 1およびQoS 2メッセージは内部キューに入れられ、リミッター設定に基づく遅延後に再試行されます。
delivery_bytes_burstクライアントごとの最大メッセージ配信トラフィックバーストdelivery_bytes_rateに加え、一時的に許可されるバースト分。上記と同様の動作。

配信レート制限がQoS 1またはQoS 2メッセージをブロックした場合、EMQXはそのメッセージと後続のQoS 1およびQoS 2メッセージをまとめてキューに入れます。これにより、配信レートリミッター自身が後続メッセージの順序が先行メッセージを追い越すことを防止します。

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

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を参照してください。