Skip to content

レート制限

EMQXは、接続速度およびメッセージ速度に対する制限を指定できる機能を提供しています。これは、システムの入口での過負荷を回避し、予測可能なスループットでシステムの安定性を保証するバックプレッシャースキームを使用しています。

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

リミッターはリスナー単位で動作できます。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リスナーに対してリミッターを設定する場合、emqx.confファイルに以下のように記述します。

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のデータバーストを許容。

サブスクライブパケットレートリミッター

サブスクライブパケットレートリミッターは各クライアント接続に独立して適用されます。

リミッターはSUBSCRIBEパケットの数をカウントし、パケット内のトピックフィルター数はカウントしません。複数のトピックフィルターを含むSUBSCRIBEパケットは1つのクォータ単位を消費します。制限に達すると、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最大接続レートノードごとに受け入れる新規接続の速度制限に達すると、EMQXはAcceptキュー内の接続処理を一時停止し、新規接続を遅延または拒否します。
max_conn_burst最大接続バーストノードがバーストで受け入れ可能な最大接続数新規接続の受け入れを一時停止

ノード単位リミッターの設定

ダッシュボードの管理 -> MQTT設定ページで、各ノードのレート制限を設定できます。

または、設定ファイルから設定することも可能です。例えば、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/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"
}

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

  • 各サブスクライバーはEMQXから1秒あたり最大100件のメッセージを受信します。これを超えるQoS 0メッセージは破棄され、QoS 1/2メッセージはキューに入り再試行されます。
  • 各サブスクライバーは1秒あたり最大1MBのメッセージデータを受信します。オーバーフロー時の動作は上記と同様です。

未指定の場合、デフォルト値はinfinityであり、配信側のレート制限を必要としない既存のデプロイメントとの後方互換性を維持します。

レート単位

時間単位

レート値でサポートされる時間単位は以下の通りです:

  • s : 秒
  • m : 分
  • h : 時間
  • d : 日

時間単位は間隔値としても指定可能です。例えば、1000/10sは「10秒ごとに1000の制限を設定する」ことを意味します。

サイズ単位

レート値でサポートされるサイズ単位は以下の通りです:

  • KB : キロバイト
  • MB : メガバイト
  • GB : ギガバイト