#node.js #mqtt
#node.js #mqtt
Вопрос:
Я использую mqtt-node для получения подписанных сообщений. Но проблема в том, что список тем для подписки будет добавлен через API. Но добавленный список тем не читается соединением mqtt при подписке на другие темы. Пожалуйста, посоветуйте или предложите подходящий способ решения этой проблемы.
Ответ №1:
Списка тем нет.
Единственный способ узнать, какие темы используются, — это либо поддерживать список, внешний по отношению к брокеру, либо подписаться на подстановочный знак и посмотреть, какие сообщения публикуются.
Важно помнить, что темы действительно существуют только в момент публикации сообщения для одного. Подписчики предоставляют список шаблонов (они могут включать подстановочные знаки типа
или #
) для сопоставления с этими опубликованными темами, и все соответствующие сообщения доставляются.
Комментарии:
1. Я считаю, что подписка на подстановочную карту — это хак, который в некоторых случаях может быть уязвимым, поэтому я избегал его по соображениям безопасности
2. Каким образом? Правильно развернутая система должна включать список ACL, поэтому, даже если вы подписались
#
, вы будете видеть только сообщения по темам, которые вам разрешено видеть.3. Спасибо за ваш ответ. Большинство развернутых известных систем, когда-либо созданных (fb, AWS, G-Colud), уже зависят от ACL, хотя в наши дни их можно взломать. Спасибо за понимание.
4. Групповые подписки НЕ являются проблемой безопасности, тем более, что вы не можете контролировать, на какие темы клиент может попытаться подписаться.
5. Задайте новый вопрос
Ответ №2:
Вы поддерживаете массив тем
var topics = [
"test/1",
"test/2",
"test/3"
]
Когда новая тема поступает через API, вам нужно сначала отказаться от подписки на существующие темы
client.unsubscribe(topics)
затем добавьте новую тему
topics.push(newTopic)
затем повторно подпишитесь
client.subscribe(topics)
Это то, что лучше всего работало для меня, когда у меня был этот вариант использования.
Имейте в виду, что за время между отменой подписки и повторной подпиской сообщения могут быть опубликованы, и ваш клиент не увидит их из-за того, что он не был подписан в то время. Это легко преодолеть, если вы можете использовать поле СОХРАНЕНИЯ для своих издателей …. но в некоторых случаях это непрактично.
Комментарии:
1. Спасибо за ответ, моя цель — не отписываться от какой-либо темы. Поэтому, если я получу какое-либо название темы через api, я могу позвонить
client.subscribe(topics)
. Насколько я понимаю, mqtt обрабатывает темы, которые вообще не публикуются. Теперь мне нужно знать, не публикуется ли какая-либо из подписанных тем, нужно ли мне отказаться от их подписки.