除了标准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消息。