消息桥接

环境信息

  • EMQ X 版本:emqx-centos7-4.3.1-amd64
  • 操作系统及版本:CentOS 7
  • 其他

问题描述

我在两台服务器上部署了emqx 集群:

都使用了消息桥接:
192.168.7.120 上的是

bridge.mqtt.aws.address = 192.168.7.121:1883

192.168.7.121 上的是

bridge.mqtt.aws.address = 192.168.7.120:1883

现在往 192.168.7.120 上发送一条消息,两台服务器会重复收到相同的消息,有没有办法避免这样的情况?


MQTT的工作模式sub端都能收到消息。如果想sub同一个topic只有一个sub端收到消息,可以使用共享订阅模式,参考我们的 官方文档


经过测试确实是只有一个订阅者会收到消息,有办法让所有订阅这条主题的订阅者都收到消息吗

你原来的情况不就是都收到么?没明白你的意思

之前使用消息桥接,两台服务器相互桥接:
a→b
b→a

这时候向任意服务器发送消息({ “msg”: “Hello, World!” }),所有这一主题的订阅者都能重复的收到这条消息,我想要让所有的这个主题的订阅者只能收到一遍{ “msg”: “Hello, World!” }

然后根据您的推荐使用了 共享订阅,倒是解决了重复收到消息的问题了,但是现在都问题是,所有这一主题的订阅者中 只有一个人会收到消息。

还有没有其他的技术能实现我的需求:在集群中,不管订阅者连接的是哪台服务器,所有订阅 test/# 主题的订阅者都能收到消息,且不会重复收到

集群即可,不需要消息桥接。

使用普通订阅,只有连接这台服务器的订阅者能收到信息,集群中连接其他服务器的订阅者都收不到消息;
使用共享订阅,集群中只有一个订阅者能收到消息。
我想让订阅者只需要连接一台服务器,订阅一次,就能收到集群中发往任意服务器的消息

理论上集群内所有订阅者都能收到消息,只要topic一致(集群的意义就是能让终端连接集群不同的服务器都能互相收发消息)。检查下你的集群工作是不是正常呢?

image


不管从哪看 都是正常工作的

方便提供一下两台服务器的日志吗?最好是debug级别的日志

image
哪一个

emqx.log.1

2021-05-28T15:39:45.684615+08:00 [warning] [Ctl] CMD acl is overidden by {emqx_acl_mnesia_cli,cli}
2021-05-28T15:41:13.026225+08:00 [error] event=connect_to_remote_server peer="emqx@192.168.7.120" result=failure reason="econnrefused"
2021-05-28T15:41:13.026378+08:00 [error] crasher: initial call: gen_rpc_client:init/1, pid: <0.2013.0>, registered_name: [], exit: {{badrpc,econnrefused},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,401}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,226}]}]}, ancestors: [gen_rpc_client_sup,gen_rpc_sup,<0.1548.0>], message_queue_len: 0, messages: [], links: [<0.1553.0>], dictionary: [], trap_exit: true, status: running, heap_size: 2586, stack_size: 28, reductions: 5743; neighbours:
2021-05-28T15:42:46.873702+08:00 [error] event=connect_to_remote_server peer="emqx@192.168.7.120" result=failure reason="econnrefused"
2021-05-28T15:42:47.964337+08:00 [error] crasher: initial call: gen_rpc_client:init/1, pid: <0.2056.0>, registered_name: [], exit: {{badrpc,econnrefused},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,401}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,226}]}]}, ancestors: [gen_rpc_client_sup,gen_rpc_sup,<0.1548.0>], message_queue_len: 0, messages: [], links: [<0.1553.0>], dictionary: [], trap_exit: true, status: running, heap_size: 2586, stack_size: 28, reductions: 5740; neighbours:

集群并没有正常工作;
debug:
检查网络状态,可以关闭一个节点,使用 ./bin/emqx console 重启节点观察集群是否正常加入
你的集群状态并没有很好的展示到deshboard,所以不排除集群的bug。希望可以提供一下复现这个bug的操作,非常感谢

在192.168.7.121上执行退出集群的命令,重新加入集群,使用 ./bin/emqx console 查看

log.to = "console"
Exec: /usr/local/emqx/erts-11.1.8/bin/erlexec -boot /usr/local/emqx/releases/4.3.1/start -mode embedded -boot_var ERTS_LIB_DIR /usr/local/emqx/erts-11.1.8/../lib -mnesia dir "/usr/local/emqx/data/mnesia/emqx@192.168.7.121" -config /usr/local/emqx/data/configs/app.2021.05.28.15.57.25.config -args_file /usr/local/emqx/data/configs/vm.2021.05.28.15.57.25.args -vm_args /usr/local/emqx/data/configs/vm.2021.05.28.15.57.25.args -start_epmd false -epmd_module ekka_epmd -proto_dist ekka -- console
Root: /usr/local/emqx
/usr/local/emqx
Protocol 'ekka': register/listen error: eaddrinuse

服务器:192.168.7.120、192.168.7.121
系统环境:CentOS 7
emqx版本:emqx-centos7-4.3.1-amd64

安装步骤:
1、分别在两台服务器上解压emqx,并启动

2、修改emqx.conf
关闭匿名登录

3、修改etc/plugins/emqx_auth_mnesia.conf
设置用户名、密码

4、启动身份认证插件./bin/emqx_ctl plugins load emqx_auth_mnesia

5、修改emqx.conf
设置节点的名称:emqx@192.168.7.120、emqx@192.168.7.121

6、重启emqx

7、在192.168.7.121上使用命令加入集群./emqx_ctl cluster join emqx@192.168.7.120
加入成功

至此,集群搭建完成,在集群任意管理平台能看到所有的客户端,但是不能收到集群内其他服务器的消息

自动集群网络失败了,如果你没有修改默认设置的话,看下4369,4370这两个端口的工作情况。
如果端口正常,且环境是测试环境(没有重要数据),可以删除data/mnesia目录,重启集群

服务器能相互ping通

4369和4370端口都开着,且没被其他应用占用

删除data/mnesia后重启集群

image

重新加入成功

但是还是收不到消息


只是用了4370端口 没有使用4369端口呢

V4版本中
使用 4370 进行集群
使用 5370 进行集群间的消息派发

telnet 下或者,检查防火墙是否开启了 5370 的访问关系呢?

1赞