作为 MQTT 转发代理的 Mosquitto

Mosquitto with persitence as MQTT Forwarding Broker

我们想在许多 OpenWRT 网关上使用 Mosquitto MQTT 作为消息代理,以将“本地”匿名 MQTT 发布转发到经过授权的中央 RabbitMQ/MQTT 集群。

我们的问题:

重新启动时,Mosquitto 无法可靠地转发排队的消息(持久性不起作用)

运行蚊子版本:1.4.15

当前配置

这是最后测试的配置:

port 1883
persistence true
persistence_file /mosquitto.db
persistence_location /etc/mosquitto

autosave_interval 1
autosave_on_changes true

allow_anonymous true

connection iotcluster
address ip:1883

notifications false
keepalive_interval 300
restart_timeout 30
start_type automatic

clientid rabbitmqtt
username user
password password

topic mqtt out 2
try_private true

只要所有系统 运行 和在线 - 一切都按预期工作 - 通过以下方式在本地发布的任何消息:

mosquitto_pub -h localhost -p 1883 -t mqtt -m "Test-Bridge-Online"

将转发并发布到 RabbitMQTT。

连接丢失

当我们产生连接丢失(例如断开电缆)并重新建立该连接时,同时收到的消息不会自动从 Mosquitto 转发到 RabbitMQTT

但是 - 当另外发送新的发布消息时 - Mosquitto 还会发送排队的消息 ???

Mosquitto 重启

如果我们在连接丢失期间重新启动 Mosquitto,排队的消息将全部丢失 - 没有 PERSISTINACE 选项工作这么久。

请帮忙

我们尝试了 autosave_intervalQoS 0/1/2other option combination 的不同选项 - 但无论如何 - 在重新启动 Mosquitto 时 - 所有消息都丢失 - 无论如何都没有持久性

运行 更新到 mosquitto 版本 1.6.10 后仍然没有成功。

我可以找出主要问题 - 设置时数据库没有保存:

persistence true
persistence_file /mosquitto.db
persistence_location /etc/mosquitto

autosave_interval 1
autosave_on_changes true

不知道为什么,但无法通过上述设置调用数据库保存。

数据库在 SIG-EXIT 时保存,但在推送新消息时不保存。

所以我将设置更改为:

persistence true
persistence_file /mosquitto.db
persistence_location /etc/mosquitto

autosave_interval 300
autosave_on_changes false

并在推送消息后调用保存数据库的请求:

# publish a new message
mosquitto_pub -h localhost -p 1883 -t mqtt -m "Test Offline 100" -q 1
# send signal to save database
killall -SIGUSR1 mosquitto

使用此功能时 - 所有类型的消息都在连接状态下排队并送达。

这是最终配置:

user mosquitto
port 1883

allow_anonymous true
queue_qos0_messages true

persistence true
persistence_file mosquitto.db
persistence_location /etc/mosquitto/
autosave_interval 300
autosave_on_changes false

connection ConName
address remote-ip:1883
bridge_protocol_version mqttv31
clientid ClientName
username user
password password
cleansession false
try_private false
retain_available false

start_type automatic
restart_timeout 60
keepalive_interval 120

notifications true
notifications_local_only true
notification_topic mqtt

topic mqtt out 1