Не подписывайтесь на # - так как сбросить все сообщения в базу данных с Mosquitto?


16

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

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

Есть ли

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

/programming//q/31584613/3984613 не исчерпывает этот вопрос.

Ответы:


12

аналогичная система (расширение / плагин) для москитного брокера

Насколько я знаю, нет никакого плагина / расширения для москитного брокера (по крайней мере, нет с открытым исходным кодом)

другой рекомендуемый метод, который работает с комарами

Ну, я могу сказать, что по моему опыту работы с брокером Mosquitto и AWS IoT вы можете просто подписаться на '#'

Разумное доказательство

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

  • 100 функций AWS Lambda, которые действуют как виртуальные конечные устройства для отправки случайных данных на шлюз (экземпляр EC2, t2.nano500 МБ ОЗУ)
  • Каждые 60 секунд запускаются функции для публикации данных в шлюзе по различным темам (lambdatoec2 / {VariableTopicNumberFrom1-100}
  • Экземпляр EC2 работает под управлением Mosquitto 1.4.10

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


«Правильный» ответ - тестирование. Если можно доказать, что добавление подписчика в # отрицательно влияет на производительность вашей системы, измените настройки посредника, чтобы запретить # подписку. Я проголосовал за этот ответ, потому что @bravokeyl сделал именно это.
Джон Детерс

11

Это обсуждение списка рассылки openHAB, кажется, предполагает, что нет проблем с использованием #в качестве подписки для получения всех сообщений:

При устранении неполадок с устройствами MQTT мне приходило в голову, что иногда мне хотелось бы видеть все сообщения MQTT, которые видит брокер Mosquitto, а не по определенной теме. Есть ли способ сделать это?

Кто-то ответил на этот вопрос для вас в списке Москит; использовать подстановочный знак. (#)

Этот вопрос переполнения стека также предлагает тот же метод:

Подписка на # дает вам подписку на все, кроме тем, которые начинаются с $ (в любом случае это обычно контрольные темы).

Лучше знать сначала, на что вы подписываетесь, хотя, конечно, и обратите внимание, что некоторые конфигурации брокера могут запретить подписку на # явно.

Как указал Бенс Кауликс , в спецификации указано , что #это действительно:

Ненормативный комментарий

  • «#» Является действительным и будет получать каждое сообщение приложения

Честно говоря, я спорю, действительно ли первоначальное утверждение вообще имеет большой смысл:

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

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

Таким образом, утверждение HiveMQ, похоже, не подтверждается большим количеством свидетельств из других источников, и, если учесть, что это на самом деле означает, оно не кажется особенно логичным.


10

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

Обработка сообщений чата для миллиарда пользователей (многие пользователи, относительно низкая скорость передачи сообщений на пользователя) отличается от системы с небольшим количеством клиентов, но с высокой скоростью передачи сообщений, и они оба отличаются от системы домашней автоматизации (мало клиентов, низкая скорость передачи сообщений) ,

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

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

Как и в других ответах, подписка на #даст вам все «нормальные» темы, то есть все, что не начинается с $. Я понимаю, что в спецификации говорится, что каждая тема, начинающаяся с, $представляет собой целое отдельное дерево, так что вам нужно подписаться $SYS/#, $whatever/#чтобы получить все . Вы, скорее всего, не хотите делать это в любом случае для обычного приложения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.