Mqtt Pub-Sub с качеством обслуживания = 2 в java

У меня есть сомнения по поводу настроек QoS = 2.

Подписчик-издатель Mqtt я использую Qos = 2. Насколько мне известно, установка Qos = 2 позволяет избежать дублирования доставки сообщений между подписчиками. В издателе я установил Qos = 2. У меня два подписчика слушают одну и ту же ТЕМУ. Мой код работает правильно, но оба подписчика получают одно и то же сообщение.

Установив Qos = 2 Только один подписчик может получить сообщение, верно?

Как решить эту проблему?

public class PubSync {
    public static void main(String[] args) {
        try {
            MqttClient client = new MqttClient(TCPAddress,MqttClient.generateClientId());
            MqttTopic topic = client.getTopic(MYTOPIC);
            MqttMessage message = new MqttMessage(msg.getBytes());
            message.setQos(2);
            client.connect();

            MqttDeliveryToken token = topic.publish(message);
            token.waitForCompletion();

            client.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

person Aravind Cheekkallur    schedule 29.11.2013    source источник


Ответы (2)


QOS 2 означает, что каждый подписчик получит только 1 копию любого данного сообщения.

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

Уровни QOS никак не меняют количество подписчиков, которые увидят сообщение.

person hardillb    schedule 29.11.2013
comment
Спасибо за ваше быстрое воспроизведение ... В моем случае ... используя более одного подписчика, слушающего одну и ту же тему, один из подписчиков может получить опубликованное сообщение ... Точно так же, как метод push pull в ZMQ. не могли бы вы предложить вариант решения этой проблемы? - person Aravind Cheekkallur; 29.11.2013
comment
MQTT работает не так: все подписчики темы получат сообщение, невозможно, чтобы оно было доставлено только одному из многих подписчиков. Вы описываете очередь сообщений, а не Pub / Sub. - person hardillb; 29.11.2013
comment
Спасибо за помощь. - person Aravind Cheekkallur; 29.11.2013

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

Это известно как общие подписки, и вы можете узнать больше о том, как это работает в продукте IBM MessageSight, здесь: http://pic.dhe.ibm.com/infocenter/ism/v1r0m0/topic/com.ibm.ism.doc/Overview/ov30010.html < / а>

person bpulito    schedule 20.03.2014
comment
Общие подписки не являются частью (текущей) спецификации MQTT 3.x. Это означает, что каждый из разных брокеров, поддерживающих этот стиль доступа, делает это по-своему. Это будет необязательный компонент MQTT 5.x, что должно означать, что все реализации будут вести себя одинаково. - person hardillb; 10.07.2017