# 大量クライアントサブスクリプション解除アラート

大量クライアントサブスクリプション解除アラートは、多数のクライアントが短時間でトピックのサブスクリプションを解除したことを示します。このアラートは、**30分前に少なくとも100件のサブスクリプションが存在し**、かつ**解除されたサブスクリプションの割合が設定された閾値を超えた場合にのみ発生します**。

この状態は、メッセージがサブスクライバーに届かなくなる可能性があります。主な原因としては、予期しないクライアントの切断、再接続後にサブスクライブし直さないクライアント、クライアントのサブスクリプション解除ロジックの不具合などが挙げられます。

## 予期しないクライアント切断

### 症状

ネットワークの不安定さ、地域的なキャリア障害、またはネットワークメンテナンスにより、多数のEMQX Cloudクライアント接続が短時間で切断されます。クライアントがパーシステントセッションや自動再接続を正しく使用していない場合、サブスクリプションが解除されてアラートが発生する可能性があります。

デプロイメントの**Monitor**ページでは、接続数とサブスクリプション数が短時間で急激に減少します。

### 主な原因

- ネットワークの不安定さや地域的な障害により、多数のクライアントが切断される。
- クライアントがパーシステントセッションを使用していないため、切断後にサブスクリプションが保持されない。
- クライアントが自動再接続を正しく実装していない。

### 対処方法

- パーシステントセッションと信頼性の高い自動再接続を設定し、クライアントが迅速に再接続してサブスクリプションを保持できるようにする。
- パーシステントセッションを有効にしている場合は、安定した`clientid`を使用し、再接続したクライアントが同じセッションとサブスクリプションを再開できるようにする。

## クライアントSDKまたはAPIコール

### 症状

接続数は比較的安定している一方で、サブスクリプション数が急激に減少します。クライアントはオンラインのままですが、サブスクリプションが積極的に解除されています。クライアントSDKの不具合や、`unsubscribe`のバッチ呼び出しなど誤ったアプリケーションAPIコールが原因の可能性があります。

デプロイメントの**Monitor**ページでは、接続数が安定している間にサブスクリプション解除数が急増します。同期間のクライアントログには、バッチ`unsubscribe`呼び出しや異常な再接続動作が記録されています。

### 主な原因

- クライアントロジックがサブスクライブ後にサブスクリプション解除し、再サブスクライブしていない。
- サードパーティSDKがClean Sessionまたはパーシステントセッション設定と互換性の問題を抱えている。
- アプリケーションコードが誤ってバッチ`unsubscribe` APIを呼び出し、多数のサブスクリプションを解除している。

### 対処方法

- クライアントロジックで再サブスクライブしないサブスクライブ-サブスクリプション解除のシーケンスを確認する。
- サードパーティSDKを最新バージョンにアップグレードし、Clean Sessionおよびパーシステントセッションの動作をテストする。
- 不要なバッチ`unsubscribe`操作を避ける。必要な場合は、クライアントがその後に正しく`resubscribe`を行うことを確認する。

## トラブルシューティング

1. EMQX Cloudコンソールにログインします。

2. **Alerts** -> **Alert List**に移動し、大量クライアントサブスクリプション解除アラートを確認して、発生期間と範囲をレビューします。

   ![クライアントサブスクリプション解除アラート記録](./_assets/clients_unsubscribe_alerts.png)

3. **Monitor** -> **Metrics** -> **Timeline** -> **Subscriptions**に移動し、過去30分間にサブスクリプション数が100件以上から減少し、設定された閾値を超えたかを確認します。

4. 発生時刻とクライアントログやアプリケーションの活動を比較し、予期しない切断か明示的なサブスクリプション解除呼び出しかを特定します。

## 監視と統計

**Metrics** -> **Timeline** -> **Subscriptions**に移動し、全体のサブスクリプション傾向を監視して、サブスクリプション解除率が回復しているかを判断します。

![監視タイムラインのサブスクリプション数](./_assets/clients_unsubscribe_monitor.png)

## クライアントサブスクリプション解除イベントの追跡

- EMQX Cloudは過去のクライアントサブスクリプション変更を保持しません。サブスクリプション解除を時間経過で追跡するには、`$events/session_unsubscribed`イベントトピックのデータ統合ルールを作成し、イベントを転送または保存してください。例：

  ```sql
  SELECT
      *
  FROM
      "$events/session_unsubscribed"
  ```

- `clientid`や`topic`などのフィールドでフィルタリングできます。詳細は[SQLデータソースとフィールド](../../rule_engine/rule_engine_events.md#unsubcribe-event-events-session-unsubscribed)を参照してください。

- このイベントはクライアントが明示的にサブスクリプションを解除した場合のみ発行されます。クライアントの切断によりサブスクリプションが解除された場合は発行されません。
