¿Debo usar los sockets web de Mosquitto o conectar clientes directamente?

11

Según este blog , Mosquitto (el corredor de MQTT) ahora admite la conexión a clientes a través de sockets web. El artículo de blog parece dar a entender que las tomas de web son más útiles para aplicaciones de navegador, ya que los navegadores web no son compatibles con los sockets TCP adecuados (todavía), aunque el protocolo websocket está apoyada por la mayoría de los navegadores modernos.

Si solo tengo varios clientes en una red (p. Ej., Sensores y actuadores basados ​​en microcontroladores como Raspberry Pis), ¿habrá alguna ventaja al usar sockets web sobre conexiones TCP directas? ¿Vale la pena la sobrecarga del protocolo de socket web cuando se está comunicando con un navegador?

Aurora0001
fuente
1
¿Puede decirnos si está codificando toda la red? Es decir, todos los nodos o cliente y servidor? ¿O si tiene que interactuar con el software de otra persona? Parece que podría estar codificando solo los clientes, pero no puedo estar seguro
Mawg dice que reinstale a Monica el
1
@Mawg el servidor será el intermediario Mosquitto MQTT, pero puedo elegir qué protocolo usaré para todos los clientes (y Mosquitto ofrece sockets web y conexiones TCP directas, por eso lo pregunté).
Aurora0001
1
Creo que hay algo de confusión aquí. Supongo que lo que @ Auroa0001 quiere decir con "TCP directo" es usar MQTT sobre TCP en lugar de MQTT sobre Websockets (... sobre TCP). En ambos casos hay bibliotecas disponibles, por lo que no es necesario escribir ningún código para los sockets.
ralight
@ en absoluto sí, esa era mi intención realmente cuando hacía la pregunta. Parece que las respuestas se extraviaron un poco.
Aurora0001

Respuestas:

7

La pregunta aquí parece ser "¿debería usar MQTT sobre TCP, o usar MQTT sobre websockets (que también va sobre TCP)?" En otras palabras, ¿"encapsular MQTT en el protocolo websockets es una buena idea?"

Esto depende (casi) completamente de su aplicación y de si necesita compatibilidad con WebSockets, probablemente para consumir mensajes en un navegador o por razones de firewall. Si no puede hacer que su servidor sea accesible en el puerto 1883 o superior 8883 para MQTT puro, entonces Websockets puede ser su mejor opción.

Websockets requiere ancho de banda adicional, pero si eso es importante para usted es algo que solo usted puede responder.

También vale la pena señalar que en las versiones actuales de Mosquitto, los websockets no funcionan tan bien como podrían, por lo que puede haber una latencia adicional al enviar / recibir mensajes de websockets. Sin embargo, eso es algo que no será un problema en futuras versiones.

ralight
fuente
7

Cuando se comunica solo dentro de su red ( intranet ), usar TCP puro estará bien. Pero si tiene que conectarse a otro servidor, surgirán problemas.

Porque la mayoría de los servidores modernos no permiten que los clientes se conecten a través de puertos aleatorios. Solo permiten la conexión de algunos puertos dedicados. Eso es todo. Por lo tanto, si tiene que conectarse a otro servidor, es mejor usar websocket en lugar de una conexión TCP pura.

Si está considerando la sobrecarga, no es mucho más grande. Puede consultar este artículo , si desea saber más sobre los gastos generales del websocket.

En mi opinión personal, es mejor usar websocket siempre, excepto que tiene algunas preocupaciones serias.

ThisaruG
fuente
2
Err, TCP y websockets son protocolos: tools.ietf.org/html/rfc6455 , además TCP es un socket de bajo nivel.
Goufalite
@ThisaruGuruge, gracias por su respuesta: en mi situación en la pregunta, supongo que elegiría TCP a través de sockets web a juzgar por su respuesta. Especialmente porque los conectores web parecen estar soportados principalmente por los navegadores, por lo que existe la sobrecarga de código de la necesidad de usar conectores web a través de conectores TCP.
Aurora0001
1
"La mayoría de los servidores modernos no permiten que los clientes se conecten a través de puertos aleatorios": el servidor puede elegir a qué puerto enlazar ( man7.org/linux/man-pages/man2/bind.2.html ), más un firewall puede restringir aún más eso. Sin embargo, yo no estoy de acuerdo cuando se dice "si tiene que conectarse a otro servidor, los problemas van a surgir". Reformule eso como " puede surgir". Incluso entonces, es una cuestión de configuración, qué sockets web probablemente harán más fácil que los sockets sin formato.
Mawg dice que reinstalar a Monica el
6

tl; dr: siempre prefiera bibliotecas gratuitas a codificarlo usted mismo (a menos que tenga requisitos extremos)


¿Debo usar los sockets web de Mosquitto o conectar clientes directamente?

¿Que tan larga es una pieza de cordon? (YMMV)

Solo puedo hablar en general, pero siempre prefiero las bibliotecas de envoltorios a los sockets sin procesar (o, de hecho, a codificar cualquier cosa que pueda obtener gratis de una biblioteca).

Hacen que la codificación sea más simple y menos propensa a errores. Se ocupan de una gran cantidad de tareas domésticas y manejo de errores, que es un código que tendrías que escribir y depurar tú mismo, donde una biblioteca generalmente ha sido bien revisada y probada y está siendo utilizada por miles de otros, todos los cuales informará / corregirá errores por usted.

Además, es menos código para mantener (y, posiblemente, puerto), lo que significa más tiempo para desarrollar, probar y pulir su aplicación, o pasar a la siguiente.

Podría decirse que la única sobrecarga es una llamada de función, si acepta que toda esa bondad del bibliotecario (manejo de errores, mantenimiento de mangueras y similares) es algo que tendría que codificar usted mismo para obtener un software bueno y estable.

Si le preocupa el rendimiento, solo perfil. Pero, a menos que su socket esté activo cientos de veces por segundo, ni siquiera me molestaría.

Mawg dice que reinstalar a Mónica
fuente
Bueno, hay bibliotecas gratuitas para conexiones TCP y conexiones de socket (web), y ambas requieren un evento de "mensaje recibido".
Goufalite
2
OP quiere saber si es mejor usar TCP o websockets para mayor eficiencia , y usted dice "use una biblioteca de abstracción para no molestarse". Claro, pero ¿cuál? En C # hay una biblioteca TcpClient en System.Net.Sockets (bueno, bueno ...) y una biblioteca websocket en un paquete nuget (WebSocketSharp). Estoy de acuerdo en que hay una biblioteca MQTT genérica para todos los idiomas, pero OP quiere tener control sobre ella para elegir qué protocolo debe usar.
Goufalite