Подстановочные знаки MQTT, обратное давление и QOS

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

Итак, я говорю о подписке QOS уровня 2. В этом случае пакеты обрабатываются по порядку. А раз есть протокол подтверждения, значит, следующее сообщение не может быть обработано, пока не будет подтверждено первое? Или это упорядочение только для приема, а не для подтверждения?

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

Редактировать:

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

Итак, в качестве теста у меня есть три темы: test/1, test/2, test2/1.

Сообщения test/2 никогда не подтверждаются.

Я попытался решить проблему с помощью wireshark, чтобы узнать, что происходит. Что происходит после того, как я отправляю сообщение на test/2, последующие сообщения никогда не отправляются подписчику с подстановочным знаком, независимо от темы. Это будет означать тот факт, что подписки с подстановочными знаками действительно не заботятся о семантике основных тем. Кажется, это еще хуже: если я разделю подписки с подстановочными знаками на две отдельные, то есть на test/1 и test/2, получится одно и то же. Любой невыпущенный пакет QOS › 0 заблокирует все соединение! Так что это, похоже, не указывает на прямую проблему с клиентом, но уже связано с сервером. Итак, снова возникает мой первоначальный вопрос: это соответствует спецификации или это просто любопытство реализации?


person Christiaan Willemsen    schedule 23.07.2020    source источник


Ответы (1)


QOS происходит в контексте отдельного сообщения, опубликованного в одной теме.

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

Тот факт, что принимающий клиент подписан на несколько тем, не имеет отношения к обработке QOS.

person Mike Organek    schedule 23.07.2020
comment
Это действительно то, чего я ожидал. Однако это то, что делают фактические реализации? Я только что попробовал брокера HiveMQ с клиентом node MQTT, и там на подстановочном знаке весь трафик останавливается, как только я не вызываю обратный вызов по одной из тем в подстановочном знаке. Более того, любая неудача в вызове обратного вызова остановит все сообщения всех тем. На самом деле это очень плохо :( - person Christiaan Willemsen; 24.07.2020
comment
Попробуйте с mosquitto и поиграйте с опцией конфигурации max_inflight_messages (я не проверял, просто предлагаю посмотреть) - person hardillb; 24.07.2020
comment
Mosquitto ведет себя точно так же, как HiveMQ, независимо от настройки max_inflight_messages. - person Christiaan Willemsen; 05.08.2020