同期クエリメソッドまたは非同期オンライン/オフライン通知メソッドを呼び出して、MQTT 用 ApsaraMQ クライアントの現在のオンラインステータスを取得できます。
MQTT 用 ApsaraMQ は、RocketMQ 用 ApsaraMQ などのバックエンドストレージメッセージキュー製品と、クラウドサーバーにデプロイされたアプリケーション(以下、サービスアプリケーション)とのワークフローを組み合わせる必要があります。
クライアントのオンラインステータスを取得する主なシナリオは次のとおりです。
メインサービスプロセス中に、クライアントがオンラインかどうかによって、後続の操作ロジックを決定する必要がある。
O&Mプロセス中に、特定のクライアントのオンラインステータスを判断する必要がある。
クライアントがオンラインまたはオフラインになったときに、サービスアプリケーションが事前に定義されたアクションをトリガーする必要がある。
概要
MQTT 用 ApsaraMQ MQTT ブロカーは、クライアントのオンラインステータスを取得するために次のメソッドをサポートしています。
同期クエリ SDK を呼び出す(近日公開予定)
このメソッドは比較的簡単です。今後、特定のクライアントのリアルタイムステータスをクエリするための SDK を提供する予定です。このメソッドは、単一クライアントのステータスを判断するのに適しています。
説明パブリックプレビュー版の HTTP または HTTPS を介した API 操作は使用できなくなりました。
非同期オンライン/オフライン通知
このメソッドは通知メッセージを使用します。クライアントがオンラインまたはオフラインになると、MQTT ブロカーはオンラインまたはオフラインメッセージをバックエンド MQ にプッシュします。サービスアプリケーションは通常、Alibaba Cloud ECS インスタンスにデプロイされます。サービスアプリケーションは、バックエンド MQ からこのメッセージをサブスクライブして、すべてのクライアントのオンライン/オフラインイベントを取得できます。
このメソッドは、クライアントのオンラインステータスではなく、クライアントステータスを非同期的に認識し、オンラインおよびオフラインイベントを検出します。したがって、クラウドベースのアプリケーションは、一連のイベントのタイムラインに基づいてクライアントステータスを分析する必要があります。
両方のメソッドの違いは次のとおりです。
同期クエリメソッドは、クライアントのリアルタイムステータスをクエリします。理論的には、非同期通知メソッドよりも正確ですが、一度に 1 つのクライアントのステータスクエリのみをサポートします。
非同期オンライン/オフライン通知メッセージはメッセージのデカップリングに基づいているため、ステータスの判断はより複雑で、不正確になる可能性が高くなります。ただし、このメソッドは、イベントに基づいて複数のクライアントの実行ステータスのトレースを分析できます。
非同期オンライン/オフライン通知
で説明したように、非同期オンライン/オフライン通知メソッドを使用する場合、オンライン/オフラインイベントはバックエンド MQ にマッピングされます。
以下は、RocketMQ 用 ApsaraMQ メッセージキューをバックエンドストレージとして使用した例です。
手順
オンラインイベントとオフラインイベントに対応するトピックを作成します。
注目したいグループ ID を持つデバイスは、MQTT 用 ApsaraMQ コンソールで対応するトピックを作成します。トピックの作成方法の詳細については、「クイックスタート」をご参照ください。
たとえば、ターゲットクライアントタイプがグループ ID GID_XXX に対応している場合、このクライアントタイプのクライアント ID とトピックはそれぞれ GID_XXX@@@YYYYY と GID_XXX_MQTT です。
ここで:
GID_XXX は、MQTT 用 ApsaraMQ コンソールで作成されたグループ ID です。
YYYYY はデバイス ID を示し、グループ ID と連結されて <GroupID>@@@<DeviceID> の形式でクライアント ID を形成します。
_MQTT は、このタイプのイベント通知のトピック名に必要な固定サフィックスを示します。
詳細については、「用語」をご参照ください。
サービスアプリケーションはこのタイプの通知をサブスクライブします。
手順 1 で作成したトピックを使用して、ターゲットクライアントのオンライン/オフラインイベントを受信します。 ApsaraMQ for RocketMQ メッセージをサブスクライブするを参照してください。サンプルコードの詳細については、MQTTClientStatusNoticeProcessDemo.javaをご参照ください。
イベントタイプは、RocketMQ 用 ApsaraMQ メッセージにオンラインまたはオフラインのタグとして配置されます。データ形式は次のとおりです。
MQ Tag:connect/disconnect/tcpclean
ここで:
connect イベントは、クライアントのオンラインイベントを示します。
disconnect イベントは、クライアントが MQTT ブロカーから積極的に切断されたことを示します。MQTT によると、クライアントは TCP 接続を積極的に解放する前に disconnect パケットを送信します。MQTT ブロカーは、disconnect パケットを受信した後に disconnect メッセージをトリガーします。クライアント SDK が disconnect パケットを送信しない場合、MQTT ブロカーは disconnect メッセージを受信できません。
tcpclean イベントは、現在の TCP 接続が切断されたことを示します。現在の TCP 接続が切断された場合、クライアントが明示的に disconnect パケットを送信したかどうかに関係なく、tcpclean イベントがトリガーされます。
説明tcpclean メッセージは、クライアントのネットワーク層接続が切断されたことを示します。disconnect メッセージは、クライアントが積極的に disconnect パケットを送信したことを示すだけです。予期しない終了により、一部のクライアントは disconnect メッセージを送信できない場合があります。これは、クライアントの実装によって異なります。したがって、tcpclean イベントに基づいて、クライアントがオフラインかどうかを判断します。
データコンテンツは JSON タイプで、関連キーは次のとおりです。
clientId は特定のデバイスを示します。
time はイベント時刻を示します。
eventType はイベントタイプを示し、クライアントがイベントを区別するために使用されます。
channelId は各 TCP 接続を一意に識別します。
clientIp は、クライアントが使用するインターネット出口 IP アドレスを示します。
例:
clientId: GID_XXX@@@YYYYY time:1212121212 eventType:connect/disconnect/tcpclean channelId:2b9b1281046046faafe5e0b458e4XXXX clientIp: 192.168.X.X:133XX
クライアントがオンラインかどうかを判断するには、オンライン/オフライン通知メッセージのコンテキストを考慮しながら、最後に受信したメッセージを確認します。
判断ルールは次のとおりです。
同じ client ID を持つクライアントによって生成されるオンラインイベントとオフラインイベントのシーケンスは、時刻によって決まります。つまり、最近のイベントほどタイムスタンプが大きくなります。
同じ clientId を持つクライアントは、一時的に複数回切断される場合があります。したがって、オフライン通知メッセージを受信したときは、channelId フィールドに基づいて、メッセージが現在の TCP 接続に関連しているかどうかを確認する必要があります。つまり、オフライン通知メッセージは、同じ channelId を持つオフライン通知メッセージのみを上書きできます。オフライン通知メッセージの channelIds が異なる場合、time の値がより最近であっても、オフライン通知メッセージを上書きすることはできません。channelId は TCP 接続を示します。1 つの connect イベントと 1 つの close イベントのみです。