除了標(biāo)準(zhǔn)MQTT協(xié)議所支持的發(fā)布/訂閱(Pub/Sub)消息收發(fā)模式外,云消息隊(duì)列 MQTT 版還支持點(diǎn)對(duì)點(diǎn)(Point to Point,簡稱P2P)模式。本文介紹P2P模式的概念、原理以及如何使用云消息隊(duì)列 MQTT 版點(diǎn)對(duì)點(diǎn)收發(fā)消息。
什么是P2P模式
P2P,顧名思義,是一對(duì)一的消息收發(fā)模式,即只有一個(gè)消息發(fā)送者和一個(gè)消息接收者。而Pub/Sub模式通常用于一對(duì)多或多對(duì)多的消息群發(fā)場景,即擁有一個(gè)或多個(gè)消息發(fā)送者和多個(gè)消息接收者的場景。
在P2P模式中,發(fā)送者發(fā)送消息時(shí)已經(jīng)明確該消息預(yù)期的接收者信息,并明確該消息只需要被特定的單個(gè)客戶端消費(fèi)。發(fā)送者發(fā)送消息時(shí)通過Topic信息直接指定接收者,接收者無需提前訂閱即可獲取該消息。
P2P模式不僅可以為接收者節(jié)省注冊(cè)訂閱關(guān)系的成本,此外,由于收發(fā)消息的鏈路有單獨(dú)的優(yōu)化,還可以降低推送延遲。
P2P模式和Pub/Sub模式的區(qū)別
在云消息隊(duì)列 MQTT 版中使用P2P模式收發(fā)消息與使用Pub/Sub的普通模式收發(fā)消息的區(qū)別如下所述:
- 發(fā)送消息時(shí),Pub/Sub模式下,發(fā)送者需要按照和接收者約定好的Topic發(fā)送消息;而P2P模式下,發(fā)送者無需事先約定傳輸消息的Topic,發(fā)送者可以直接按照規(guī)范發(fā)送消息到目標(biāo)的接收者。
- 接收消息時(shí),Pub/Sub模式下,接收者需要按照和發(fā)送者約定好的Topic提前訂閱才能收到消息;而P2P模式下接收者無需事先訂閱即可接收消息,從而簡化接收者的程序邏輯,節(jié)省訂閱成本。
發(fā)送P2P消息
使用MQTT SDK發(fā)送P2P消息時(shí),需將二級(jí)Topic設(shè)為“p2p”,將三級(jí)Topic設(shè)為目標(biāo)接收者的Client ID。
Java示例
String p2pTopic =topic+"/p2p/GID_xxxx@@@DEVICEID_001";
sampleClient.publish(p2pTopic,message);
使用云消息隊(duì)列 RocketMQ 版的SDK發(fā)送P2P消息時(shí),由于一級(jí)Topic和子級(jí)Topic是分開設(shè)置的,因此只需要將子級(jí)Topic屬性設(shè)置成上述的子級(jí)Topic字符串。
Java示例
String subTopic="/p2p/GID_xxxx@@@DEVICEID_001";
msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);
發(fā)送P2P消息的多語言代碼示例的鏈接如下表所示。
語言 | 鏈接 |
---|---|
.NET | .NET示例代碼 |
C | C示例代碼 |
Java | Java示例代碼 |
JavaScript | JavaScript示例代碼 |
Python | Python示例代碼 |
PHP | PHP示例代碼 |
接收P2P消息
接收消息的客戶端無需任何訂閱處理,只需要完成客戶端的初始化即可收到P2P消息。