除了標準MQTT協議所支援的發布/訂閱(Pub/Sub)訊息收發模式外,雲Message QueueTT 版還支援點對點(Point to Point,簡稱P2P)模式。本文介紹P2P模式的概念、原理以及如何使用雲Message QueueTT 版點對點收發訊息。
什麼是P2P模式
P2P,顧名思義,是一對一的訊息收發模式,即只有一個訊息寄件者和一個訊息接收者。而Pub/Sub模式通常用於一對多或多對多的訊息群發情境,即擁有一個或多個訊息寄件者和多個訊息接收者的情境。
在P2P模式中,寄件者發送訊息時已經明確該訊息預期的接收者資訊,並明確該訊息只需要被特定的單個用戶端消費。寄件者發送訊息時通過Topic資訊直接指定接收者,接收者無需提前訂閱即可擷取該訊息。
P2P模式不僅可以為接收者節省註冊訂閱關係的成本,此外,由於收發訊息的鏈路有單獨的最佳化,還可以降低推送延遲。
P2P模式和Pub/Sub模式的區別
在雲Message QueueTT 版中使用P2P模式收發訊息與使用Pub/Sub的普通模式收發訊息的區別如下所述:
- 發送訊息時,Pub/Sub模式下,寄件者需要按照和接收者約定好的Topic發送訊息;而P2P模式下,寄件者無需事先約定傳輸訊息的Topic,寄件者可以直接按照規範發送訊息到目標的接收者。
- 接收訊息時,Pub/Sub模式下,接收者需要按照和寄件者約定好的Topic提前訂閱才能收到訊息;而P2P模式下接收者無需事先訂閱即可接收訊息,從而簡化接收者的程式邏輯,節省訂閱成本。
發送P2P訊息
使用MQTT SDK發送P2P訊息時,需將二級Topic設為“p2p”,將三級Topic設為目標接收者的Client ID。
Java樣本
String p2pTopic =topic+"/p2p/GID_xxxx@@@DEVICEID_001";
sampleClient.publish(p2pTopic,message);
使用雲訊息佇列 RocketMQ 版的SDK發送P2P訊息時,由於一級Topic和子級Topic是分開設定的,因此只需要將子級Topic屬性設定成上述的子級Topic字串。
Java樣本
String subTopic="/p2p/GID_xxxx@@@DEVICEID_001";
msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);
發送P2P訊息的多語言程式碼範例的連結如下表所示。
語言 | 連結 |
.NET | .NET範例程式碼 |
C | C範例程式碼 |
Java | Java範例程式碼 |
JavaScript | JavaScript範例程式碼 |
Python | Python範例程式碼 |
PHP | PHP範例程式碼 |
說明 不支援使用Go SDK收發P2P訊息。
接收P2P訊息
接收訊息的用戶端無需任何訂閱處理,只需要完成用戶端的初始化即可收到P2P訊息。