Share via


MQTT クライアントのライフ サイクル イベント

クライアント ライフ サイクル イベントを使用すると、アプリケーションはクライアントの接続ステータスまたはクライアント リソースの操作に関するイベントに反応できます。 これにより次の操作を行うことができます。

  • クライアントの接続状態を監視します。 たとえば、クライアントの接続を分析して動作を最適化するアプリケーションを構築できます。
  • クライアントの切断を軽減するアクションを実行します。 たとえば、自動軽減フローを開始するアプリケーションを構築したり、クライアントが切断されるたびにサポート チケットを作成したりすることができます。
  • クライアントが接続されている名前空間を追跡します。 たとえば、フェールオーバーを開始した後、クライアントが適切な名前空間に接続されていることを確認します。

イベントの種類

Event Grid 名前空間は、次のイベントの種類を発行します。

イベントの種類 説明
Microsoft.EventGrid.MQTTClientSessionConnected MQTT クライアントのセッションが Event Grid に接続されたときに発行されます。
Microsoft.EventGrid.MQTTClientSessionDisconnected MQTT クライアントのセッションが Event Grid から切断されたときに発行されます。
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Event Grid 名前空間で MQTT クライアントが作成または更新されたときに発行されます。
Microsoft.EventGrid.MQTTClientDeleted MQTT クライアントが Event Grid 名前空間から削除されたときに発行されます。

イベント スキーマ

クライアント のライフ サイクル イベントでは、接続または切断されたクライアントとセッションに関するすべての情報が提供されます。 また、診断シナリオに使用できる disconnectionReason も提供されます。これにより、軽減措置を自動化することができます。

このサンプル イベントは、MQTT クライアントのセッションが Event Grid に接続されたときに発生するイベントのスキーマを示しています。

[{
  "specversion": "1.0",
  "id": "5249c38a-a048-46dd-8f60-df34fcdab06c",
  "time": "2023-07-29T01:23:49.6454046Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionConnected",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1
  }
}]

このサンプル イベントは、MQTT クライアントのセッションが Event Grid から切断されたときに発生するイベントのスキーマを示しています。

[{
  "specversion": "1.0",
  "id": "e30e5174-787d-4e19-8812-580148bfcf7b",
  "time": "2023-07-29T01:27:40.2446871Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionDisconnected",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1,
    "disconnectionReason": "ClientInitiatedDisconnect"
  }
}]

このサンプル イベントは、Event Grid 名前空間で MQTT クライアントが作成または更新されたときに発生するイベントのスキーマを示しています。

[{
  "specversion": "1.0",
  "id": "383d1562-c95f-4095-936c-688e72c6b2bb",
  "time": "2023-07-29T01:14:35.8928724Z",
  "type": "Microsoft.EventGrid.MQTTClientCreatedOrUpdated",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "createdOn": "2023-07-29T01:14:34.2048108Z",
    "updatedOn": "2023-07-29T01:14:34.2048108Z",
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1",
    "state": "Enabled",
    "attributes": {
      "attribute1": "value1"
    }
  }
}]

このサンプル イベントは、MQTT クライアントが Event Grid 名前空間から削除されたときに発生するイベントのスキーマを示しています。

[{
  "specversion": "1.0",
  "id": "2a93aaf9-66c2-4f8e-9ba3-8d899c10bf17",
  "time": "2023-07-29T01:30:52.5620566Z",
  "type": "Microsoft.EventGrid.MQTTClientDeleted",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1"
  }
}]

切断理由:

次の一覧では、disconnectionReason のさまざまな値とその説明について詳しく説明します。

切断理由: 説明
ClientAuthenticationError 認証上の理由でクライアントが切断されました (たとえば、証明書の有効期限が切れた、クライアントが無効になった、クライアント構成が変更されたなど)
ClientAuthorizationError 認可上の理由でクライアントが切断されました (たとえば、トピック空間、アクセス許可バインド、またはクライアント グループの構成が変更されたため)
ClientError クライアントが不正な要求を送信したか、サポートされていない機能のいずれかを使用したため、サービスによって接続が終了されました。
ClientInitiatedDisconnect クライアントが、MQTT の DISCONNECT パケットまたは WebSocket 経由の MQTT のクローズ フレームを介して正常な切断を開始しています。
ConnectionLost クライアントとサーバー間の接続が失われています。
IpForbidden クライアントの IP アドレスが、IP フィルターまたはプライベート リンクの構成によってブロックされています。
QuotaExceeded クライアントが 1 つ以上のスロットリング制限を超えたため、サービスによって接続が終了されました。
ServerError 予期しないサーバー エラーが原因で接続が終了しました
ServerInitiatedDisconnect 運用上の理由でサーバーが正常な切断を開始します
SessionOverflow クライアントの未確認 QoS1 メッセージのキューが制限に達したため、サーバーによって接続が終了されました
SessionTakenOver クライアントが同じ認証名で再接続したため、前の接続が終了しました。

各プロパティの詳しい説明については、Event Grid 名前空間のイベント スキーマに関する記事を参照してください。

ヒント

接続状態の変動率の高い処理: クライアントの切断イベントを受信したら、一定の期間 (30 秒ほど) 待機し、軽減措置を実行する前にクライアントがまだオフラインであることを確認します。 この最適化により、急速に変化する状態を処理する効率が向上します。

構成

Azure portal の構成

クライアント のライフ サイクル イベントを生成するには、次の手順に従います。

  1. 名前空間で、[イベント] タブに移動します。
  2. [+Event Subscription](+イベント サブスクリプション) を選択します。
    • Event Grid サブスクリプションの名前を指定します。
    • イベントの使用に適したイベント スキーマを選択します。
    • [イベントの種類] でイベントをフィルター処理します。
    • エンドポイントの詳細を入力します。
  3. [作成] を選択します。

Azure CLI の構成

クライアント のライフ サイクル イベントを生成するには、次の手順に従います。

  1. システム トピックを作成する
az eventgrid system-topic create --resource-group <Resource Group > --name <System Topic Name> --location \<Region> --topic-type Microsoft.EventGrid.Namespaces --source /subscriptions//resourceGroups/<Resource Group >/providers/Microsoft.EventGrid/namespaces/<Namespace Name>
  1. Event Grid のサブスクリプションを作成します
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

動作:

  • クライアントのライフサイクル イベントの遅延に対する保証はありません。 クライアント接続状態イベントは、リアルタイム接続状態ではなく、クライアント セッションの接続の最後に報告された状態を示します。
  • クライアントのライフ サイクル イベントが重複して発行される場合があります。
  • クライアントのライフ サイクル イベントのタイムスタンプは、サービスがイベントを検出した時刻を示します。これは、イベントの実際の時刻とは異なる場合があります。
  • クライアントのライフサイクル イベントの順序は保証されません。イベントは順不同で到着する可能性があります。 ただし、接続状態イベントのシーケンス番号を使用して、イベントの元の順序を決定することはできます。
  • Client Created または Updated イベントと Client Deleted イベントの場合:
    • 短時間内にクライアント リソースに複数の状態変化があった場合、クライアントの最終状態に対して 1 つのイベントが発行されます。
    • 例 1: クライアントが作成され、3 秒以内に 2 回更新された場合、EG はクライアントのメタデータの最終値を含む MQTTClientCreatedOrUpdated イベントを 1 つだけ発行します。
    • 例 2: クライアントが作成されてから 5 秒以内に削除された場合、EG は MQTTClientDeleted イベントのみを発行します。

接続状態イベントを並べ替え:

MQTTClientSessionConnected イベントと MQTTClientSessionDisconnected イベントのシーケンス番号を使用すると、新しいイベントごとにシーケンス番号がインクリメントされるため、クライアント セッションの接続の最後に報告された状態を判断できます。 MQTTClientSessionDisconnected のシーケンス番号は、同じ接続の MQTTClientSessionConnected イベントのシーケンス番号と常に一致します。 たとえば、次のイベントとシーケンス番号の一覧は、同じクライアントに対して適切な順序でイベントのサンプルです:

  • MQTTClientSessionConnected > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSessionConnected > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

イベントを並べ替えるサンプル ロジックを次に示します。各クライアントについて:

  • 最初のイベントのシーケンス番号と接続状態を格納します。
  • 新しい MQTTClientSessionConnected イベントごとに:
    • 新しいシーケンス番号が前のシーケンス番号より大きい場合は、シーケンス番号と接続状態を新しいイベントと一致するように更新します。
  • 新しい MQTTClientSessionDisconnected イベントごとに:
    • 新しいシーケンス番号が前のシーケンス番号以上の場合は、新しいイベントに一致するようにシーケンス番号と接続状態を更新します。

次のステップ