Não assine # - então, como despejar todas as mensagens no banco de dados com o Mosquitto?

16

O blog do HiveMQ lista sob "práticas recomendadas" para não assinar o curinga de vários níveis ao tentar despejar todas as mensagens em um banco de dados. Eles afirmam que o cliente assinante pode não conseguir acompanhar um alto carregamento de mensagens e propõem usar um plug-in do broker para conectar-se diretamente ao fluxo de mensagens.

Às vezes, é necessário assinar todas as mensagens transferidas pelo broker, por exemplo, ao persistir todas elas em um banco de dados. Isso não deve ser feito usando um cliente MQTT e assinando o curinga de vários níveis. O motivo é que geralmente o cliente assinante não é capaz de processar a carga de mensagens que está chegando. Especialmente se você tiver um rendimento maciço. Nossa solução recomendada é implementar uma extensão no broker MQTT, por exemplo, o sistema de plug-ins do HiveMQ permite que você se ligue ao comportamento do HiveMQ e inclua uma rotina assíncrona para processar cada mensagem recebida e persistir em um banco de dados.

Existe também

  • um sistema semelhante (extensão / plugin) para o broker de mosquito,
  • outro método recomendado que funcione com mosquito ou
  • evidência razoável de que essa abordagem é desnecessária, ou seja, que um cliente que está se inscrevendo #pode se sair bem?

/programming//q/31584613/3984613 não aborda esta questão exaustivamente.

Ghanima
fonte

Respostas:

12

um sistema semelhante (extensão / plugin) para o intermediário mosquitto

Até onde eu sei, não há plug-in / extensão para o mosquiteiro broker (pelo menos, não há código-fonte aberto)

outro método recomendado que trabalha com mosquito

Bem, posso dizer que, de acordo com minha experiência com o Mosquitto broker e o AWS IoT, basta assinar diretamente '#'

Evidência razoável

Depois de analisar essa pergunta, fiquei um pouco curioso para saber os limites de taxa de transferência e descobrir se há necessidade de um sistema de extensão. Então, configurei o seguinte:

  • 100 funções do AWS Lambda que atuam como dispositivos finais virtuais para enviar alguns dados aleatórios ao Gateway (instância do EC2 de t2.nano500 MB de RAM)
  • A cada 60 segundos, as funções são acionadas para publicar dados no gateway para diferentes tópicos (lambdatoec2 / {VariableTopicNumberFrom1-100}
  • A instância do EC2 está executando o Mosquitto 1.4.10

A partir de agora, vejo que não há problema em assinar # sem nenhum sistema de extensão. Mas, novamente, ainda tenho que testar alguns cenários de casos extremos (vou atualizar a resposta assim que testá-los).

bravokeyl
fonte
A resposta "correta" está testando. Se for demonstrado que o desempenho do seu sistema é afetado adversamente pela adição de um assinante em #, reconfigure o broker para não permitir # assinaturas. Votei positivamente nesta resposta porque @bravokeyl fez exatamente isso.
John Deters
11

Esta discussão na lista de discussão do openHAB parece sugerir que não há problema em usar #como assinatura para receber todas as mensagens:

Ao solucionar problemas de dispositivos MQTT, ocorreu-me que às vezes eu gostaria de ver todas as mensagens MQTT que o broker do Mosquitto vê, em vez de sobre um tópico específico. Existe uma maneira de fazer isso?

Alguém respondeu a essa pergunta para você na lista do Mosquitto; use um curinga. (#)

Esta pergunta de estouro de pilha também sugere o mesmo método:

A assinatura de # fornece uma assinatura de tudo, exceto os tópicos que começam com $ (normalmente são tópicos de controle).

É melhor saber o que você está inscrevendo primeiro, é claro, e observe que algumas configurações do broker podem impedir a inscrição explicitamente em #.

Conforme apontado por Bence Kaulics , a especificação afirma que #é válido:

Comentário não normativo

  • "#" É válido e receberá todas as mensagens do aplicativo

Sinceramente, discuto se a afirmação original realmente faz muito sentido:

O motivo é que geralmente o cliente assinante não é capaz de processar a carga de mensagens que está chegando.

Se for esse o caso, como o broker pode lidar com as mensagens em primeiro lugar? Contanto que seu cliente tem características de desempenho semelhantes ao corretor, I fortemente duvido que seria possível sobrecarregar o cliente, porque esse nível de tráfego também sobrecarregar o corretor e causa que a falhar em primeiro lugar.

Em resumo, a declaração HiveMQ não parece ser suportada por muitas evidências de outras fontes e, quando você considera o que realmente significaria, não parece particularmente lógico.

Aurora0001
fonte
10

Eu acho que é importante considerar que existem muitos casos de uso diferentes para os intermediários do MQTT, como em qualquer software.

O tratamento de mensagens de bate-papo para um bilhão de usuários (muitos usuários, taxa de mensagens relativamente baixa por usuário) é diferente de um sistema com poucos clientes, mas com uma alta taxa de mensagens, e ambos são diferentes de um sistema de automação residencial (poucos clientes, baixa taxa de mensagens) .

O HiveMQ está pensando nos aplicativos de taxa de cliente / mensagem muito altos - nesse caso, a capacidade do broker quase certamente excede em muito a capacidade de um cliente.

Se você deseja se inscrever #no seu sistema de automação residencial, é muito improvável que cause problemas. Você pode verificar e ver se o broker está usando CPU excessiva em qualquer caso.

Como nas outras respostas, inscrever- #se fornecerá todos os tópicos 'normais', ou seja, qualquer coisa que não comece com a $. Eu interpreto a especificação como dizendo que cada tópico começando com $uma árvore separada todo em si mesmo, então você teria que assinar $SYS/#, $whatever/#para obter tudo . Você provavelmente não quer fazer isso de qualquer maneira para um aplicativo normal.

ralight
fonte