レート制限
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で設定します。
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個のバーストが許容される。 - クライアント毎のデータパブリッシュ最大レートは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に以下のように設定します。
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セクション内に以下のように埋め込めます。
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で設定します。
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 : ギガバイト