Dois-je utiliser les sockets Web de Mosquitto ou connecter directement les clients?

11

Selon ce blog , Mosquitto (le courtier MQTT) prend désormais en charge la connexion aux clients via des sockets Web. L'article de blog semble laisser entendre que les sockets Web sont plus utiles pour les applications de navigateur, car les navigateurs Web ne prennent pas encore en charge les sockets TCP appropriés, bien que le protocole de socket Web soit pris en charge par la majorité des navigateurs modernes.

Si je n'ai que divers clients dans un réseau (par exemple, des capteurs et des actionneurs basés sur des microcontrôleurs tels que Raspberry Pis), y aura-t-il un avantage à utiliser des sockets Web sur des connexions TCP directes? La surcharge du protocole de socket Web en vaut-elle la peine uniquement lorsque vous communiquez avec un navigateur?

Aurora0001
la source
1
Pouvez-vous nous dire si vous codez l'ensemble du réseau? C'est-à-dire tous les nœuds ou le client et le serveur? Ou si vous devez interagir avec le logiciel de quelqu'un d'autre? Il semble que vous ne codiez que les clients, mais je ne suis pas sûr
Mawg dit réintégrer Monica
1
@Mawg, le serveur sera le courtier Mosquitto MQTT, mais je peux choisir le protocole que j'utilise pour tous les clients (et Mosquitto propose à la fois des sockets Web et des connexions TCP directes, c'est pourquoi j'ai demandé).
Aurora0001
1
Je pense qu'il y a une certaine confusion ici. Je suppose que @ Auroa0001 veut dire par "TCP direct" en utilisant MQTT sur TCP plutôt que MQTT sur Websockets (... sur TCP). Dans les deux cas, des bibliothèques sont disponibles, donc pas besoin d'écrire de code pour les sockets.
ralight
@ralight oui, c'était vraiment mon intention en posant la question. Il semble que les réponses se soient un peu égarées.
Aurora0001

Réponses:

7

La question ici semble être "dois-je utiliser MQTT sur TCP, ou utiliser MQTT sur des websockets (qui va également sur TCP)?" En d'autres termes, "l'encapsulation de MQTT dans le protocole websockets est-elle une bonne idée?"

Cela dépend (presque) entièrement de votre application et de la question de savoir si vous avez besoin de la prise en charge Websockets - probablement pour consommer des messages dans un navigateur ou pour des raisons de pare-feu. Si vous ne pouvez pas avoir votre serveur accessible sur le port 1883 ou mieux 8883 pour MQTT pur, alors les websockets peuvent être votre meilleure option.

Les Websockets nécessitent une bande passante supplémentaire, mais vous ne pouvez répondre que si cela est important pour vous.

Il convient également de noter que dans les versions actuelles de Mosquitto, les Websockets ne fonctionnent pas aussi bien qu'ils le pourraient, de sorte qu'il peut y avoir une latence supplémentaire lors de l'envoi / la réception de messages Websockets. Ce n'est toutefois pas un problème dans les futures versions.

ralight
la source
7

Lorsque vous communiquez uniquement à l'intérieur de votre réseau ( intranet ), l'utilisation de TCP pur sera très bien. Mais si vous devez vous connecter à un autre serveur, des problèmes surviendront.

Parce que la plupart des serveurs modernes ne permettent pas aux clients de se connecter via des ports aléatoires. Ils permettent uniquement à certains ports dédiés de se connecter. C'est tout. Par conséquent, si vous devez vous connecter à un autre serveur, mieux vaut utiliser websocket plutôt qu'une connexion TCP pure.

Si vous considérez les frais généraux, ce n'est pas beaucoup plus gros. Vous pouvez vous référer à cet article , si vous voulez en savoir plus sur la surcharge du websocket.

À mon avis, il est préférable d'utiliser toujours websocket, sauf que vous avez de sérieuses préoccupations.

ThisaruG
la source
2
Err, TCP et websockets sont des protocoles: tools.ietf.org/html/rfc6455 , en outre TCP EST une socket de bas niveau.
Goufalite
@ThisaruGuruge merci pour votre réponse - dans mon scénario à la question, je suppose que vous choisiriez TCP sur des sockets Web à en juger par votre réponse? D'autant plus que les sockets web semblent être principalement pris en charge par les navigateurs, il y a donc un surcoût de code de devoir utiliser des sockets web sur des sockets TCP.
Aurora0001
1
"la plupart des serveurs modernes ne permettent pas aux clients de se connecter via des ports aléatoires" - le serveur peut choisir le port auquel se lier ( man7.org/linux/man-pages/man2/bind.2.html ), plus un pare-feu peut restreindre davantage cela. Cependant, je ne pas d' accord quand vous dites « si vous devez vous connecter à un autre serveur, les problèmes vont surgir ». Reformulez cela comme " peut survenir". Même alors, c'est une question de configuration, que les sockets web rendront probablement plus facile que les sockets brutes.
Mawg dit réintégrer Monica
6

tl; dr - préférez toujours les bibliothèques gratuites au codage vous-même (sauf si vous avez des exigences extrêmes)


Dois-je utiliser les sockets Web de Mosquitto ou connecter directement les clients?

Quelle est la longueur d'une ficelle? (YMMV)

Je ne peux parler que de manière générale, mais je préfère toujours les bibliothèques de wrapper aux sockets brutes (ou, en fait, au codage de tout ce que je peux obtenir gratuitement à partir d'une bibliothèque).

Ils rendent le codage plus simple et moins sujet aux erreurs. Ils s'occupent de beaucoup de gestion et de gestion des erreurs, ce qui est du code que vous auriez à écrire et à déboguer vous-même, alors que la bibliothèque a généralement été bien examinée et testée et est utilisée par des milliers d'autres, tous vous signalera / corrigera des bogues.

De plus, il vous faut moins de code à maintenir (et, éventuellement, à porter), ce qui signifie plus de temps pour développer, tester et peaufiner votre application, ou passer à la suivante.

Le seul surcoût est sans doute un appel de fonction, si vous acceptez que toute cette qualité de bibliothécaire (gestion des erreurs, gestion des flexibles, etc.) est quelque chose que vous devrez vous coder pour obtenir un logiciel bon et stable.

Si vous êtes préoccupé par les performances, il suffit de profiler. Mais, à moins que votre socket ne soit actif des centaines de fois par seconde, je ne m'embêterais même pas.

Mawg dit réintégrer Monica
la source
Eh bien, il existe des bibliothèques gratuites pour les connexions TCP et les connexions de socket (Web), et les deux nécessitent un événement "message reçu".
Goufalite
2
OP veut savoir s'il vaut mieux utiliser TCP ou websockets pour plus d' efficacité , et vous dites "utilisez une bibliothèque d'abstraction pour ne pas vous embêter". Bien sûr, mais lequel? En C #, il y a une bibliothèque TcpClient dans System.Net.Sockets (enfin, bien ...) et une bibliothèque websocket dans un paquet nuget (WebSocketSharp). Je suis d'accord qu'il existe une bibliothèque générique MQTT pour toutes les langues, mais OP souhaite en avoir le contrôle pour choisir le protocole à utiliser.
Goufalite