Devo usar os soquetes da Web do Mosquitto ou conectar clientes diretamente?

11

De acordo com este blog , o Mosquitto (o corretor MQTT) agora suporta a conexão com clientes através de soquetes da web. O artigo do blog parece sugerir que os soquetes da Web são mais úteis para aplicativos de navegador, já que os navegadores da Web ainda não suportam soquetes TCP adequados, embora o protocolo de soquete da Web seja suportado pela maioria dos navegadores modernos.

Se eu tiver apenas vários clientes em uma rede (por exemplo, sensores e atuadores baseados em microcontroladores, como Raspberry Pis), haverá alguma vantagem em usar soquetes da Web em conexões TCP diretas? A sobrecarga do protocolo de soquete da Web vale apenas quando você está se comunicando com um navegador?

Aurora0001
fonte
1
Você pode nos dizer se está codificando toda a rede? Ou seja, todos os nós ou cliente e servidor? Ou se você precisar interagir com o software de outra pessoa? Parece que você pode estar codificando apenas os clientes, mas não tenho certeza
Mawg diz que restabelece Monica
1
@Mawg, o servidor será o intermediário Mosquitto MQTT, mas posso escolher qual protocolo eu uso para todos os clientes (e o Mosquitto oferece soquetes da web e conexões TCP diretas, e foi por isso que perguntei).
Aurora0001
1
Eu acho que há alguma confusão aqui. Presumo que @ Auroa0001 significa "TCP direto" está usando MQTT sobre TCP em vez de MQTT sobre Websockets (... sobre TCP). Nos dois casos, existem bibliotecas disponíveis, portanto, não é necessário escrever nenhum código para soquetes.
ralight
@ diretamente, sim, essa era minha intenção realmente ao fazer a pergunta. As respostas foram um pouco erradas, ao que parece.
Aurora0001

Respostas:

7

A pergunta aqui parece ser "devo usar o MQTT sobre TCP ou usar o MQTT sobre websockets (que também passa por TCP)?" Em outras palavras, "encapsular o MQTT no protocolo websockets é uma boa idéia?"

Isso depende (quase) inteiramente do seu aplicativo e se você precisa de suporte para Websockets - provavelmente para consumir mensagens em um navegador ou por motivos de firewall. Se você não pode ter seu servidor acessível na porta 1883 ou melhor 8883 para MQTT puro, os websockets podem ser sua melhor opção.

Websockets requer largura de banda extra, mas se isso é importante para você é algo que você pode responder.

Também é importante notar que nas versões atuais do Mosquitto, os websockets não funcionam tão bem quanto poderiam, para que haja uma latência extra ao enviar / receber mensagens dos websockets. Isso é algo que não será um problema em versões futuras.

ralight
fonte
7

Quando você estiver se comunicando apenas dentro da sua rede ( intranet ), o TCP puro será adequado. Mas se você precisar se conectar a outro servidor, surgirão problemas.

Porque a maioria dos servidores modernos não permite que os clientes se conectem através de portas aleatórias. Eles permitem apenas a conexão de algumas portas dedicadas. Isso é tudo. Portanto, se você precisar se conectar a outro servidor, é melhor usar o websocket em vez da conexão TCP pura.

Se você está considerando a sobrecarga, não é muito maior. Você pode consultar este artigo , se quiser saber mais sobre a sobrecarga do websocket.

Na minha opinião pessoal, é melhor usar o websocket sempre, exceto se você tiver algumas preocupações sérias.

ThisaruG
fonte
2
Err, TCP e websockets são protocolos: tools.ietf.org/html/rfc6455 , além disso, TCP é um soquete de baixo nível.
Goufalite
@ThisaruGuruge, obrigado pela sua resposta - no meu cenário na pergunta, presumo que você escolheria o TCP sobre os soquetes da Web, julgando pela sua resposta? Especialmente porque os soquetes da Web parecem ser suportados principalmente pelos navegadores, então existe a sobrecarga de código da necessidade de usar os soquetes da Web nos soquetes TCP.
Aurora0001
1
"a maioria dos servidores modernos não permite que os clientes se conectem através de portas aleatórias" - o servidor pode escolher a qual porta se conectar ( man7.org/linux/man-pages/man2/bind.2.html ), mais um firewall pode restringir ainda mais isso. No entanto, eu não concordar quando você diz "se você tem que conectar a outro servidor, os problemas irão surgir". Reformule isso como " pode surgir". Mesmo assim, é uma questão de configuração, quais websockets provavelmente tornarão mais fáceis do que os soquetes brutos.
Mawg diz que restabelece Monica
6

tl; dr - sempre prefira bibliotecas gratuitas a codificá-las (a menos que você tenha requisitos extremos)


Devo usar os soquetes da Web do Mosquitto ou conectar clientes diretamente?

Quanto tempo dura um pedaço de barbante? (YMMV)

Só posso falar de maneira geral, mas sempre prefiro bibliotecas wrapper a soquetes brutos (ou, de fato, a codificar qualquer coisa que eu possa obter gratuitamente de uma biblioteca).

Eles tornam a codificação mais simples e menos propensa a erros. Eles cuidam de muitas tarefas domésticas e de tratamento de erros, que é o código que você precisaria escrever e depurar, onde a biblioteca geralmente foi bem revisada e testada e está sendo usada por milhares de outras pessoas, todas elas irá relatar / corrigir bugs para você.

Além disso, é menos código para você manter (e, possivelmente, port), o que significa mais tempo para desenvolver, testar e aperfeiçoar seu aplicativo ou seguir para o próximo.

A única sobrecarga é sem dúvida uma chamada de função, se você aceitar que toda essa bondade do bibliotecário (manipulação de erros, manutenção de mangueiras e similares) é algo que você precisaria codificar para se tornar um software bom e estável.

Se você está preocupado com o desempenho, basta criar um perfil. Mas, a menos que seu soquete esteja ativo centenas de vezes por segundo, eu nem me incomodaria.

Mawg diz que restabelece Monica
fonte
Bem, existem bibliotecas gratuitas para conexões TCP e conexões de soquete (web), e ambas requerem um evento de "mensagem recebida".
Goufalite
2
O OP quer saber se é melhor usar TCP ou websockets para obter eficiência , e você diz "use uma biblioteca de abstração para não se incomodar". Claro, mas qual? Em C #, há uma biblioteca TcpClient em System.Net.Sockets (bem, bem ...) e uma biblioteca de websocket em um pacote de nuget (WebSocketSharp). Concordo que existe uma biblioteca MQTT genérica para todos os idiomas, mas o OP deseja ter controle sobre ele para escolher qual protocolo deve usar.
Goufalite