Должен ли я использовать веб-сокеты Mosquitto или напрямую подключать клиентов?

11

Согласно этому блогу , Mosquitto (брокер MQTT) теперь поддерживает подключение к клиентам через веб-сокеты. В блоге статья , кажется, намекают , что веб - сокеты являются более полезными для браузерных приложений, так как веб - браузеры не поддерживают соответствующие сокеты TCP (пока), хотя протокол веб - сокет будет поддержан большинством современных браузеров.

Если у меня просто есть несколько клиентов в сети (например, датчики и исполнительные механизмы на основе микроконтроллеров, таких как Raspberry Pis), будет ли какое-то преимущество в использовании веб-сокетов по сравнению с прямыми соединениями TCP? Стоит ли издержки протокола веб-сокета только тогда, когда вы общаетесь с браузером?

Аврора0001
источник
1
Можете ли вы сказать нам, если вы кодируете всю сеть? Т.е. все узлы или и клиент и сервер? Или вам нужно взаимодействовать с чужим программным обеспечением? Похоже, вы можете кодировать только клиентов, но я не уверен,
говорит Моуг, восстановите Монику
1
@Mawg сервер будет брокером Mosquitto MQTT, но я могу выбрать, какой протокол я использую для всех клиентов (и Mosquitto предлагает как веб-сокеты, так и прямые TCP-соединения, поэтому я и спросил).
Аврора0001
1
Я думаю, что здесь есть некоторая путаница. Я предполагаю, что @ Auroa0001 подразумевает под «прямым TCP» использование MQTT через TCP, а не MQTT через веб-сокеты (... через TCP). В обоих случаях доступны библиотеки, поэтому нет необходимости писать код для сокетов.
ralight
@ Да, именно так я и собирался задавать вопрос. Кажется, ответы немного сбились с пути.
Aurora0001

Ответы:

7

Здесь возникает вопрос: «Должен ли я использовать MQTT через TCP или использовать MQTT через веб-сокеты (что также идет через TCP)?» Другими словами, является ли "инкапсуляция MQTT в протоколе websockets хорошей идеей?"

Это (почти) полностью зависит от вашего приложения и от того, нужна ли вам поддержка веб-сокетов - возможно, для потребления сообщений в браузере или по причинам брандмауэра. Если ваш сервер не может быть доступен через порт 1883 или лучше 8883 для чистого MQTT, то веб-сокеты могут быть вашим лучшим вариантом.

Websockets требует дополнительной пропускной способности, но о том, важно ли это для вас, может ответить только вы.

Стоит также отметить, что в текущих версиях Mosquitto веб-сокеты работают не так хорошо, как могли бы, поэтому могут быть дополнительные задержки при отправке / получении сообщений веб-сокетов. Это то, что не будет проблемой в будущих версиях, хотя.

ralight
источник
7

Когда вы общаетесь только внутри вашей сети ( интрасети ), использование чистого TCP будет в порядке. Но если вам нужно подключиться к другому серверу, возникнут проблемы.

Потому что большинство современных серверов не позволяют клиентам подключаться через случайные порты. Они позволяют подключать только некоторые выделенные порты. Это все. Следовательно, если вам нужно подключиться к другому серверу, лучше использовать веб-сокет, а не просто TCP-соединение.

Если вы рассматриваете накладные расходы, это не намного больше. Вы можете обратиться к этой статье , если хотите узнать больше о накладных расходах websocket.

По моему личному мнению, лучше использовать websocket всегда, кроме случаев, когда у вас есть серьезные проблемы.

ThisaruG
источник
2
Err, TCP и websockets являются протоколами: tools.ietf.org/html/rfc6455 , кроме того, TCP - это сокет низкого уровня.
Гуфалит
@ThisaruGuruge спасибо за ваш ответ - в моем сценарии в вопросе я предполагаю, что вы выбрали бы TCP через веб-сокеты, судя по вашему ответу? Тем более, что веб-сокеты, похоже, в основном поддерживаются браузерами, поэтому накладные расходы кода требуют использования веб-сокетов поверх TCP-сокетов.
Aurora0001
1
«большинство современных серверов не позволяют клиентам подключаться через случайные порты» - сервер может выбрать, к какому порту подключаться ( man7.org/linux/man-pages/man2/bind.2.html ), а также брандмауэр далее ограничим это. ОДНАКО, я не согласен , когда вы говорите «если у вас есть , чтобы подключиться к другому серверу, проблемы будут возникать». Перефразировать это как « может возникнуть». Даже тогда, это вопрос конфигурации, какие веб-сокеты, вероятно, сделают проще, чем сырые сокеты.
Mawg говорит восстановить Монику
6

tl; dr - всегда предпочитайте бесплатные библиотеки кодированию самостоятельно (если у вас нет особых требований)


Должен ли я использовать веб-сокеты Mosquitto или напрямую подключать клиентов?

Как долго это кусок строки? (YMMV)

Я могу говорить только в целом, но я всегда предпочитаю библиотеки-оболочки для необработанных сокетов (или, на самом деле, для кодирования всего, что я могу получить бесплатно из библиотеки).

Они делают кодирование проще и менее подвержены ошибкам. Они позаботятся о ведении домашнего хозяйства и обработке ошибок, то есть коде, который вам придется писать и отлаживать самостоятельно, поскольку библиотека, как правило, хорошо проверена и протестирована и используется тысячами других, каждый из которых сообщит / исправит ошибки для вас.

Кроме того, для вас требуется меньше кода (и, возможно, порта) для поддержки, что означает больше времени для разработки, тестирования и совершенствования приложения или перехода к следующему.

Единственные издержки - это, возможно, вызов функции, если вы согласны с тем, что все эти блага библиотекаря (обработка ошибок, хранение шлангов и т. П.) - это то, что вам придется кодировать самостоятельно, чтобы получить хорошее, стабильное программное обеспечение.

Если вы беспокоитесь о производительности, просто профиль. Но, если бы ваш сокет не работал сотни раз в секунду, я бы даже не стал беспокоиться.

Mawg говорит восстановить Монику
источник
Ну, есть бесплатные библиотеки для соединений TCP и (веб) сокетов, и обе требуют события «полученное сообщение».
Гуфалит
2
OP хочет знать, лучше ли использовать TCP или веб-сокеты для эффективности , и вы говорите: «используйте библиотеку абстракций, чтобы не беспокоиться». Конечно, но какой? В C # Существует библиотека TcpClient в System.Net.Sockets (ну, хорошо ...) и библиотека websocket в пакете nuget (WebSocketSharp). Я согласен, что есть универсальная библиотека MQTT для всех языков, но OP хочет иметь контроль над ней, чтобы выбрать, какой протокол он должен использовать.
Гуфалит