ApsaraMQ for MQTT は、MQTT プロトコルで定義される標準のパブリッシュ/サブスクライブ (Pub/Sub) モデルに加えて、ポイントツーポイント (P2P) メッセージングモデルをサポートしています。P2P を使用すると、受信者が事前にトピックをサブスクライブしていなくても、送信者は特定のクライアントにメッセージを直接配信できます。
P2P を使用する理由
標準の Pub/Sub ワークフローでは、1 対 1 のメッセージングを行うために、送信者と受信者が事前に共通のトピックに合意しておく必要があります。受信者は、メッセージが到着する前にそのトピックを能動的にサブスクライブする必要があります。これにより、アプリケーションロジックとサブスクリプションレジストリの両方にオーバーヘッドが発生します。
P2P では、これらの制約が解消されます:
事前合意したトピックが不要 -- 送信者はクライアント ID で受信者を指定します。どちらの側も、事前にトピック名を調整する必要はありません。
サブスクリプションが不要 -- 受信者は接続して初期化を完了すると、すぐに P2P メッセージを受信します。明示的なサブスクライブ呼び出しは不要です。
プッシュレイテンシーの低減 -- メッセージングリンクが P2P 配信向けに個別最適化されるため、Pub/Sub のファンアウトに比べてエンドツーエンドレイテンシーが低減されます。
Pub/Sub と P2P の比較
| 観点 | Pub/Sub | P2P |
|---|---|---|
| トポロジー | 1 対多、または多対多 | 1 対 1 |
| トピックの合意 | 送信者と受信者が事前にトピックに合意する必要がある | 送信者がトピック内で受信者のクライアント ID を直接指定する |
| サブスクリプション | 受信者は、メッセージを受信する前にトピックをサブスクライブする必要がある | サブスクリプションは不要 -- 受信者は初期化を完了するだけでよい |
| 代表的なユースケース | 複数のコンシューマーに更新をブロードキャストする | 特定のデバイスに対して、対象を絞ったコマンドまたは通知を送信する |
トピック形式
P2P メッセージでは、3 階層のトピック構造を使用します:
{parentTopic}/p2p/{receiverClientID}| セグメント | 説明 | 例 |
|---|---|---|
{parentTopic} | MQTT クライアントがパブリッシュする権限を持つ第 1 階層のトピック | mytopic |
p2p | P2P メッセージであることを示す固定キーワード (第 2 階層のトピックとして設定) | p2p |
{receiverClientID} | 受信者の完全なクライアント ID (第 3 階層のトピックとして設定)。形式は <GroupID>@@@<DeviceID> です。GroupID は GID_ で始まる必要があり、ApsaraMQ for MQTT コンソールで事前に作成するか、CreateGroupId API を呼び出して作成する必要があります。DeviceID はクライアントで定義します。送信者がトピックで使用するクライアント ID は、受信者のクライアント ID と一致している必要があります。 | GID_xxxx@@@DEVICEID_001 |
組み立てられたトピックは次のようになります:
mytopic/p2p/GID_xxxx@@@DEVICEID_001たとえば、GroupID が GID_Iot、DeviceID が 4444444 の場合、完全なクライアント ID は GID_Iot@@@4444444 となり、組み立てられたトピックは mytopic/p2p/GID_Iot@@@4444444 になります。
P2P メッセージの送信
MQTT SDK から
親トピックに /p2p/{receiverClientID} を付加して P2P トピックを構築し、そのトピックにパブリッシュします。
Java
// P2P トピックを構築: parentTopic + /p2p/ + 受信者のクライアント ID
String p2pTopic = topic + "/p2p/GID_xxxx@@@DEVICEID_001";
sampleClient.publish(p2pTopic, message);ApsaraMQ for RocketMQ SDK から
ApsaraMQ for RocketMQ SDK では、親トピックとサブトピックを個別に設定します。MqttSecondTopic ユーザープロパティに、P2P サブトピック文字列を設定します。
Java
// 特定の MQTT クライアントを対象にするサブトピックを設定
String subTopic = "/p2p/GID_xxxx@@@DEVICEID_001";
msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);SDK のダウンロードとサンプルコード
SDK をダウンロードし、サポートされている各言語で P2P メッセージを送信するためのサンプルコードを確認します。
言語 | SDK | サンプルコード |
.NET | ||
C | ||
Java | ||
JavaScript | ||
Python | ||
PHP |
Go SDK は、P2P メッセージの送信または受信をサポートしていません。
P2P メッセージの受信
サブスクリプションは不要です。標準の MQTT クライアント初期化を完了すると、クライアントは自身のクライアント ID に宛てられた P2P メッセージを自動的に受信します。