我正在使用mosquitto作为我的经纪人服务器。我想基于桥接连接构建一个代理集群。
当我发布然后订阅主题“在场”时,我从三个代理服务器收到了无数重复的消息。
我有三台服务器,例如: 10.80.1.1,10.80.1.2
我为每台服务器配置了以下配置。
on server 10.80.1.1, the config as the following:
connection myconn
address 10.80.1.2:1881
topic # both
cleansession true
try_private false
bridge_attempt_unsubscribe false
notifications false
allow_anonymous true
start_type automatic
clientid Bridge3
on server 10.80.1.2, the config as the following:
connection myconn
address 10.80.1.1:1883
topic # both
cleansession true
try_private false
bridge_attempt_unsubscribe false
notifications false
allow_anonymous true
start_type automatic
clientid Bridge2
谁能帮助我解决这个问题。
答案 0 :(得分:2)
有一点 - 我认为你把配置放在这里是一个错字:
address 10.80.1.1:1883,10.80.1.2:1883
多个地址的分隔符是“”,而不是“,”。
问题是您在订阅中创建了一个循环。
当Bridge3收到消息时,它会发布到Bridge2。 Bridge2知道消息来自Bridge3,并且Bridge3是一个桥接器,所以尽管主题规则说它应该将消息发送回Bridge3,但事实并非如此。它会将消息发送到Bridge1。
现在我假设Bridge1最终连接到Bridge3而不是Bridge2。在这种情况下,由于与上面相同的原因,Bridge1不会将消息返回给Bridge2,但它会将消息发送到Bridge3。
Bridge3不知道这是与原始消息相同的消息,因此它发布到Bridge1,因此循环继续。
原始问题的答案在上面。
更新回答:
你应该使用
try_private true
这允许网桥向远程主机指示它们是桥接器,并且是在某些情况下可以避免环路的方式。
答案 1 :(得分:0)
它是一个循环,如配置topic # both
,
从任何一台服务器删除/注释掉所有网桥配置,然后重新启动mosquitto
on server 10.80.1.1, the config as the following:
connection myconn
address 10.80.1.2:1881
topic # both
cleansession true
try_private false
bridge_attempt_unsubscribe false
notifications false
allow_anonymous true
start_type automatic
clientid Bridge3
on server 10.80.1.2, the config as the following:
#connection myconn
#address 10.80.1.1:1883
#topic # both
#cleansession true
#try_private false
#bridge_attempt_unsubscribe false
#notifications false
#allow_anonymous true
#start_type automatic
#clientid Bridge2