Подписчик получает только первые 2/3 сообщений от издателя при использовании QoS1 или выше для публикации.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Подписчик получает только первые 2/3 сообщений от издателя при использовании QoS1 или выше для публикации.

Сообщение Anonymous »

Я тестирую сервер Mosquitto, используя две программы Python. Брокер Mosquitto — это докер на машине с Linux, программы Python работают на моей машине с Windows. Один подписан на тему «Тест» и постоянно слушает и выводит все полученные сообщения на стандартный вывод + добавляет их в лог-файл. Второй отправляет указанное количество сообщений в тему «Тест» так быстро, как только возможно.
Это отлично работает, когда издатель и подписчик используют QoS 0. Однако при использовании QoS 1 для издателя, по-прежнему все сообщения передаются, но только 60-90% сообщений принимаются при использовании ~ 50 сообщений и более. Я также тестировал это со 100, 1000 и 10 000 сообщений - всегда получается около 2/3 сообщений, независимо от количества отправленных сообщений. Кроме того, никакие промежуточные сообщения не отбрасываются, а только те, которые находятся в конце.
Это становится еще хуже при изменении издателя на QoS 2, тогда только 30-50% моих сообщений принимаются абонента.
Уровень QoS моего абонента установлен на 0, изменение его на 1 или 2 ничего не меняет.
Оба скрипта подключены одинаково пользователь.
Я думаю, что система, возможно, не сможет обработать все сообщения так быстро, но почему она не отбрасывает сообщения между ними, а только обрезает их в конец, независимо от количества сообщений?
Вот программа-издатель:
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, reason_code, properties):
print(f"Connected with result code {reason_code}")

broker_hostname = "myhost"
port = 1883

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(username="user", password="password")
client.on_connect = on_connect

client.connect(broker_hostname, port)
client.loop_start()

topic = "Test"
msg_count = 0

try:
while msg_count < 1000:
msg_count += 1
result = client.publish(topic, msg_count, qos=1)
status = result[0]
if status == 0:
print("Message " + str(msg_count) + " is published to topic " + topic)
else:
print("Failed to send message to topic " + topic)
if not client.is_connected():
print("Client not connected, exiting...")
break

finally:
client.disconnect()
client.loop_stop()

и программа подписки:
import paho.mqtt.client as mqtt
import logging

logging.basicConfig(filename="log.txt", level=logging.INFO)

def on_connect(client, userdata, flags, reason_code, properties):
print(f"Connected with result code {reason_code}")

client.subscribe("Test", qos=0) # also tested with qos=2, no difference in behaviour

def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
logging.info(msg.payload)

broker_hostname = "myhost"
port = 1883

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(username="user", password="password")
client.on_connect = on_connect
client.on_message = on_message

client.connect(broker_hostname, port)
client.loop_forever()

Моя информация о комарах:
persistence true
persistence_location /mosquitto/data/
log_type subscribe
log_type unsubscribe
log_type websockets
log_type error
log_type warning
log_type notice
log_type information
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout

password_file /mosquitto/passwd_file
allow_anonymous false

# MQTT Default listener
listener 1883 0.0.0.0

# MQTT over WebSockets
listener 9001 0.0.0.0
protocol websockets


Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-qos1-or
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»