можно ли использовать MQTT для реализации поведения запроса / ответа

Мы планируем использовать MQTT для доставки сообщений с нашего сервера на устройства Android. Мы решили использовать сервер mosquitto с открытым исходным кодом.

в большинстве случаев этого достаточно (публикация / подписка), но у нас есть случаи, когда клиенту необходимо отправить параметры и получить ответ от сервера. Я знаю, что прямой подход - использовать Http (например, сервлеты). но можем ли мы добиться этого с помощью MQTT, поскольку это будет означать более низкое потребление полосы пропускания для пользователя?


person A.Alqadomi    schedule 09.04.2013    source источник


Ответы (4)


Да, это просто требует тщательной разработки структуры вашей темы. В качестве очень простого примера вы можете опубликовать на control/<client id>/request и подписаться на control/<client id>/response

person ralight    schedule 10.04.2013
comment
Но предположим, что у меня есть 10000 клиентов, которые все запрашивают с сервера, если я реализовал это с помощью Http-сервлета, например, мне бы не о чем беспокоиться. но может ли компонент (на стороне сервера) обрабатывать все запросы, поступающие одновременно? Другими словами, на какое максимальное количество тем клиент может подписаться, потому что для каждого подключающегося клиента нам придется добавлять новую подписку ?? - person A.Alqadomi; 10.04.2013
comment
Да, конечно, это вызывает беспокойство. В таких цитатах, как "Мой тест", участвовало 100 тыс. Клиентов, подписанных на 100 тыс. Тем (из lists.launchpad.net/mosquitto -users / msg00110.html) должны дать вам представление о том, что возможно! - person ralight; 10.04.2013
comment
bitreactive.com/mqtt-request-response использует именно такой подход, все о структура темы - person Clocker; 07.04.2016
comment
@Clocker ссылка мертва - person Mohammed Noureldin; 07.07.2021

Начиная с версии 5 MQTT это возможно. В спецификации указан шаблон запроса / ответа.

Взгляните на это: https://stackoverflow.com/a/59916330/1137669

person basickarl    schedule 13.02.2020

Я рекомендую вам посмотреть, как RabbitMQ обрабатывает RPC. Хотя AMQP отличается от MQTT, существует довольно много переноса высокого уровня.

Это сводится к тому, что вам нужна либо возможность создавать эфемерные очереди «Ответить» с идентификаторами корреляции с использованием заголовков сообщений. Или, как сказал @ralight, для каждого клиента открыты две очереди. Проблема с двумя очередями, открытыми для каждого клиента, конечно же, упорядочивается, и поэтому вам придется использовать идентификаторы корреляции, буфер и маршрут внутри (или отбрасывать до тех пор, пока идентификатор корреляции не будет найден, если ваше приложение синхронно).

person Adam Gent    schedule 10.04.2013

Вы также можете сделать то же самое с помощью xargs.

Вот пример сценария оболочки:

mqtt_eg_link.sh

d=$(date +%Y-%m-%d)
mosquitto_pub -h <your host> -p 1880 -t status/ghost/log -m "$d >> eg listener running"
mosquitto_sub -h <your host> -p 1880 -t ghost | xargs -t -I {} cmd.exe /c eg.bat {}
person Dan Edens    schedule 27.10.2020