すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for MQTT:P2P メッセージングモデル

最終更新日:Aug 13, 2026

ApsaraMQ for MQTT は、MQTT プロトコルで定義される標準のパブリッシュ/サブスクライブ (Pub/Sub) モデルに加えて、ポイントツーポイント (P2P) メッセージングモデルをサポートしています。P2P を使用すると、受信者が事前にトピックをサブスクライブしていなくても、送信者は特定のクライアントにメッセージを直接配信できます。

P2P を使用する理由

標準の Pub/Sub ワークフローでは、1 対 1 のメッセージングを行うために、送信者と受信者が事前に共通のトピックに合意しておく必要があります。受信者は、メッセージが到着する前にそのトピックを能動的にサブスクライブする必要があります。これにより、アプリケーションロジックとサブスクリプションレジストリの両方にオーバーヘッドが発生します。

P2P では、これらの制約が解消されます:

  • 事前合意したトピックが不要 -- 送信者はクライアント ID で受信者を指定します。どちらの側も、事前にトピック名を調整する必要はありません。

  • サブスクリプションが不要 -- 受信者は接続して初期化を完了すると、すぐに P2P メッセージを受信します。明示的なサブスクライブ呼び出しは不要です。

  • プッシュレイテンシーの低減 -- メッセージングリンクが P2P 配信向けに個別最適化されるため、Pub/Sub のファンアウトに比べてエンドツーエンドレイテンシーが低減されます。

Pub/Sub と P2P の比較

観点Pub/SubP2P
トポロジー1 対多、または多対多1 対 1
トピックの合意送信者と受信者が事前にトピックに合意する必要がある送信者がトピック内で受信者のクライアント ID を直接指定する
サブスクリプション受信者は、メッセージを受信する前にトピックをサブスクライブする必要があるサブスクリプションは不要 -- 受信者は初期化を完了するだけでよい
代表的なユースケース複数のコンシューマーに更新をブロードキャストする特定のデバイスに対して、対象を絞ったコマンドまたは通知を送信する

トピック形式

P2P メッセージでは、3 階層のトピック構造を使用します:

{parentTopic}/p2p/{receiverClientID}
セグメント説明
{parentTopic}MQTT クライアントがパブリッシュする権限を持つ第 1 階層のトピックmytopic
p2pP2P メッセージであることを示す固定キーワード (第 2 階層のトピックとして設定)p2p
{receiverClientID}受信者の完全なクライアント ID (第 3 階層のトピックとして設定)。形式は <GroupID>@@@<DeviceID> です。GroupIDGID_ で始まる必要があり、ApsaraMQ for MQTT コンソールで事前に作成するか、CreateGroupId API を呼び出して作成する必要があります。DeviceID はクライアントで定義します。送信者がトピックで使用するクライアント ID は、受信者のクライアント ID と一致している必要があります。GID_xxxx@@@DEVICEID_001

組み立てられたトピックは次のようになります:

mytopic/p2p/GID_xxxx@@@DEVICEID_001

たとえば、GroupIDGID_IotDeviceID4444444 の場合、完全なクライアント 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

Eclipse Paho .NET SDK

.NET sample code

C

Eclipse Paho C SDK

C sample code

Java

Eclipse Paho SDK

Java sample code

JavaScript

Eclipse Paho JavaScript

JavaScript sample code

Python

Eclipse Paho Python SDK

Python sample code

PHP

Mosquitto-PHP

PHP sample code

説明

Go SDK は、P2P メッセージの送信または受信をサポートしていません。

P2P メッセージの受信

サブスクリプションは不要です。標準の MQTT クライアント初期化を完了すると、クライアントは自身のクライアント ID に宛てられた P2P メッセージを自動的に受信します。