Além do modelo padrão de publicação/assinatura (Pub/Sub) definido pelo protocolo MQTT, o ApsaraMQ for MQTT oferece suporte ao modelo de mensagens ponto a ponto (P2P). O P2P permite que um remetente entregue uma mensagem diretamente a um cliente específico, sem exigir que o destinatário assine um tópico previamente.
Por que usar P2P
Em um fluxo de trabalho Pub/Sub padrão, a comunicação um para um exige que remetente e destinatário concordem antecipadamente com um tópico compartilhado. O destinatário precisa assinar ativamente esse tópico antes da chegada de qualquer mensagem, o que adiciona sobrecarga tanto à lógica da aplicação quanto ao registro de assinaturas.
O P2P elimina essas restrições:
Sem tópico pré-definido -- O remetente direciona a mensagem ao destinatário usando o ID do cliente. Nenhuma das partes precisa coordenar um nome de tópico com antecedência.
Assinatura desnecessária -- O destinatário recebe mensagens P2P assim que se conecta e conclui a inicialização. Não é necessária nenhuma chamada explícita de assinatura.
Menor latência de push -- O link de mensagens é otimizado separadamente para entrega P2P, reduzindo a latência de ponta a ponta em comparação à distribuição Pub/Sub.
Comparação entre P2P e Pub/Sub
|
Dimensão |
Pub/Sub |
P2P |
|
Topologia |
Um para muitos ou muitos para muitos |
Um para um |
|
Acordo de tópico |
Remetente e destinatário devem concordar com um tópico antecipadamente |
O remetente especifica o ID do cliente destinatário diretamente no tópico |
|
Assinatura |
O destinatário deve assinar o tópico antes de receber mensagens |
Assinatura desnecessária -- basta que o destinatário conclua a inicialização |
|
Caso de uso típico |
Transmissão de atualizações para múltiplos consumidores |
Envio de um comando ou notificação direcionada a um dispositivo específico |
Formato do tópico
As mensagens P2P utilizam uma estrutura de tópico de três níveis:
{parentTopic}/p2p/{receiverClientID}
|
Segmento |
Descrição |
Exemplo |
|
|
Tópico de primeiro nível no qual seu cliente MQTT tem permissão para publicar |
|
|
|
Palavra-chave fixa que identifica esta mensagem como P2P (definida como tópico de segundo nível) |
|
|
|
ID do cliente do destinatário pretendido (defina como tópico de terceiro nível) |
|
O tópico montado apresenta o seguinte formato:
mytopic/p2p/GID_xxxx@@@DEVICEID_001
Enviar mensagens P2P
Usando um SDK MQTT
Construa o tópico P2P anexando /p2p/{receiverClientID} ao seu tópico pai e, em seguida, publique nele.
Java
// Build the P2P topic: parentTopic + /p2p/ + receiver's client ID
String p2pTopic = topic + "/p2p/GID_xxxx@@@DEVICEID_001";
sampleClient.publish(p2pTopic, message);
Usando um SDK do ApsaraMQ for RocketMQ
No SDK do ApsaraMQ for RocketMQ, os tópicos pai e subtópicos são configurados separadamente. Defina a propriedade de usuário MqttSecondTopic com a string do subtópico P2P.
Java
// Set the subtopic to target a specific MQTT client
String subTopic = "/p2p/GID_xxxx@@@DEVICEID_001";
msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);
Downloads de SDK e código de exemplo
Baixe um SDK e visualize o código de exemplo para envio de mensagens P2P em cada linguagem compatível.
|
Linguagem |
SDK |
Código de exemplo |
|
.NET |
||
|
C |
||
|
Java |
||
|
JavaScript |
||
|
Python |
||
|
PHP |
O SDK Go não oferece suporte ao envio ou recebimento de mensagens P2P.
Receber mensagens P2P
Não é necessária nenhuma assinatura. Conclua a inicialização padrão do cliente MQTT e ele receberá automaticamente qualquer mensagem P2P endereçada ao seu ID de cliente.