標準の Message Queuing Telemetry Transport(MQTT)プロトコルでサポートされているパブリッシュ/サブスクライブ(Pub/Sub)メッセージングモデルに加えて、ApsaraMQ for MQTT は、ポイントツーポイント(P2P)メッセージングモデルもサポートしています。このトピックでは、P2P モデルの概念と原則について説明します。また、ApsaraMQ for MQTT を使用して P2P メッセージを送受信する方法についても説明します。
P2P モデルとは
P2P は、1 対 1 のメッセージングシナリオで使用されるメッセージングモデルであり、メッセージの送信者と受信者はそれぞれ 1 つだけです。Pub/Sub モデルは通常、1 対多または多対多のメッセージングシナリオで使用され、1 つ以上のメッセージ送信者と複数のメッセージ受信者が存在します。
P2P モデルでは、送信者はメッセージを送信するときに目的の受信者を指定し、メッセージが特定のクライアントによってのみ消費されるようにします。送信者はメッセージを送信するときにトピック情報で受信者を直接指定し、受信者はトピックを事前にサブスクライブすることなくメッセージを受信できます。
P2P モデルは、受信者のサブスクリプション登録のコストを削減するだけでなく、メッセージングリンクが個別に最適化されるため、プッシュの待機時間も短縮します。
P2P モデルを使用したメッセージングと Pub/Sub モデルを使用したメッセージング
ApsaraMQ for MQTT で P2P モデルと Pub/Sub モデルを使用してメッセージングする場合の違いは次のとおりです。
メッセージの送信:Pub/Sub モデルでは、送信者は受信者と合意したトピックにメッセージを送信する必要があります。P2P モデルでは、送信者はメッセージ送信のために事前にトピックについて合意する必要はありません。送信者は、規則に基づいて受信者にメッセージを直接送信できます。
メッセージの受信:Pub/Sub モデルでは、受信者はメッセージを受信するために、送信者と事前に合意したトピックをサブスクライブする必要があります。P2P モデルでは、受信者はトピックを事前にサブスクライブすることなくメッセージを受信できます。これにより、受信側のプログラムロジックが簡素化され、サブスクリプションコストが削減されます。
P2P メッセージを送信する
ApsaraMQ for MQTT SDK を使用して P2P メッセージを送信する場合、第 2 レベルトピックを p2p に、第 3 レベルトピックを受信者のクライアント ID に設定する必要があります。
Java のサンプルコード
String p2pTopic =topic+"/p2p/GID_xxxx@@@DEVICEID_001";
sampleClient.publish(p2pTopic,message);
ApsaraMQ for RocketMQ SDK を使用して P2P メッセージを送信する場合は、親トピックとサブトピックが個別に設定されているため、前のサンプルコードのサブトピック文字列に subtopic プロパティを設定するだけで済みます。
Java のサンプルコード
String subTopic="/p2p/GID_xxxx@@@DEVICEID_001";
msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);
次の表に、さまざまなプログラミング言語の SDK と P2P メッセージを送信するためのサンプルコードをダウンロードするためのリンクを示します。
言語 | SDK ダウンロード | サンプルコード |
.NET | ||
C | ||
Java | ||
JavaScript | ||
Python | ||
PHP |
Go 用の SDK は、P2P メッセージの送受信をサポートしていません。
P2P メッセージを受信する
メッセージを受信するクライアントは、P2P メッセージを受信する前に初期化を完了するだけで済みます。