消息重复publish

目前环境是两台5.8做的集群,通过ng负载代理了两台集群的8084端口,现在有一个业务上游,在集群上建立了连接器,从上游拿数据,通过规则进行重发布,业务段(订阅端)直接订阅集群的重发布主题,目前每条上游下来的数据,都会重复publish(两次),不知道是哪里没配置正确,请教。
使用mqttx工具直接订阅上游,没有重复数据情况。

你可以仔细检查一下完全的 trace 日志里面订阅了什么主题。
只听你的描述的话,很大可能是
订阅了重复的主题。
比如:
同时订阅 t/1 和 t/#
发布一条t/1 那就会收到 收到2条消息。

我使用mqttx工具,直接订阅的重发布的主题,也是会收到重复的内容。


这里应该是没有重复订阅的吧?我把服务停了开始trace,然后重新连接。

那你不能一直什么都不说,然后让我猜,猜错了,再给一点信息。想考我呢…

那我就再猜一下,再不中,你就自己去 debug 吧。
应该是你 republish 的主题和你原来的主题有重叠。
比如:
你订阅了 t/#
发布的t/1 重发布为t/2
那你就会收到2条。

我没说清楚,没有做通配符订阅
目前项目有一个上游服务(获取数据端),自建emqx集群(两台),nginx负载emqx端口,一个业务段(订阅端),开启了双向认证。
上游的订阅主题是a,重发布主题是transfer/a,目前代码使用的是普通订阅方式。
使用mqttx测试订阅上游,不重复
使用mqttx测试重发布,重复
业务段代码测试重发布,重复。


使用 5.8.6 按你的步骤没有重现。

a只是举个例子
实际主题是transfer/freedom/dtu/send


还是没有重现 。我没什么想法了。

不好意思,你是要重现吗?
我才开始接触emqx,不太懂你要做的操作,而且你那边做订阅,不需要我这边服务的连接信息吗?

对,需要能重现步骤,我只要本地能重现,才能知道问题在哪里

但是我这边连接器的ip内网的,要有vpn才能访问。
有其它办法能协助调查这个问题的吗?

那就没办法了

不好意思,我重新描述一下目前的情况,
服务器:两台内网服务器(8.23和8.24)
集群发现方式:手动
运行方式:docker
镜像版本:emqx/emqx:5.8
在8.24上运行emqx ctl cluster join 8.23加入成功。

ng:两台,有服务器的SLB负载
端口:使用ng负载了1883、8084端口,负载到8.23和8.24,8083和8883禁用了。
使用网络工具暴露ng1883工具地址xxxx,目前使用VPN连接1883进行测试。

emqx配置
连接器:连接上游(数据服务)
规则:数据输入,通过上面连接器,订阅了数据(freedom/dtu/send)频道;数据输出:做了重发布到自定义频道(transfer/energy/rec)。

使用mqttx工具连接暴露的ng1883的地址,订阅transfer/energy/rec频道,能正常连接,可正常接收到频道返回的数据,但是目前的状况是上游数据会被重新发布到新频道两次。

请教,是我哪里没有配置正确吗?

8.23的数据日志


8.24的数据日志

两台role都是core;
而且ng上做了会话保持

@zhongwencool
老师,这个会是因为两个core导致的吗?

目前使用两台服务器,role都是core的集群,使用的开源版本。
有两台ng服务,做了负载代理,emqx的1883端口和8084端口。
在emqx上配置了连接器,连接上游数据服务,做了一个数据接收并转发的规则
输入:订阅上游数据频道,接收消息;输出:做重发布到新频道,供本地代码服务订阅收取数据,本地代码服务也是订阅到ng集群。
目前情况是上游的一条数据,到代码后会有两条,一模一样的数据。通过mqttx工具连接ng集群也是同样问题。
求教,可能是什么原因?

从你的描述来看,我没看出来什么问题。
但是你的 23,24 日志里面表明他们几乎同时收到了一个freedom/dtu/send的消息。
说明应该是有客户端同时连了 2 台 emqx 发布了消息.建议你从这里开始查。