除了標準MQTT協議所支持的發布/訂閱(Pub/Sub)消息收發模式外,云消息隊列 MQTT 版還支持點對點(Point to Point,簡稱P2P)模式。本文介紹P2P模式的概念、原理以及如何使用云消息隊列 MQTT 版點對點收發消息。

什么是P2P模式

P2P,顧名思義,是一對一的消息收發模式,即只有一個消息發送者和一個消息接收者。而Pub/Sub模式通常用于一對多或多對多的消息群發場景,即擁有一個或多個消息發送者和多個消息接收者的場景。

在P2P模式中,發送者發送消息時已經明確該消息預期的接收者信息,并明確該消息只需要被特定的單個客戶端消費。發送者發送消息時通過Topic信息直接指定接收者,接收者無需提前訂閱即可獲取該消息。

P2P模式不僅可以為接收者節省注冊訂閱關系的成本,此外,由于收發消息的鏈路有單獨的優化,還可以降低推送延遲。

P2P模式和Pub/Sub模式的區別

云消息隊列 MQTT 版中使用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示例代碼
CC示例代碼
JavaJava示例代碼
JavaScriptJavaScript示例代碼
PythonPython示例代碼
PHPPHP示例代碼
說明 不支持使用Go SDK收發P2P消息。

接收P2P消息

接收消息的客戶端無需任何訂閱處理,只需要完成客戶端的初始化即可收到P2P消息。