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

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

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

リミッターはリスナー単位で動作させることができます。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   | リスナーごとの最大接続バースト                 | リスナーがバーストで受け入れ可能な最大接続数。               | 新規接続の受信を一時停止。                                 |

リスナー単位で動作する配信レートリミッターは、過負荷時の動作が異なります。詳細は[配信レートリミッター](#delivery-rate-limiters)をご覧ください。

例えば、デフォルトの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](https://docs.emqx.com/en/enterprise/v6.3.1/hocon/)をご参照ください。

:::
