A,B实例组成集群,客户端1连接A实例并订阅主题C,客户端2连接B实例并向主题C中发消息,客户端1能收到消息么

错误报告

环境

  • EMQX 版本:4.4.10
  • 操作系统版本:centos7

重现此问题的步骤

  1. xxx
  2. xxx
  3. xxx

预期行为

实际行为


功能请求

描述你需要的功能

为什么你需要这个功能


其他

当然是可以的。订阅信息在集群节点间是共享的。

A,B实例组成集群,客户端1连接A实例并订阅主题$share/back/p7/#,客户端2连接B实例并向主题p7/dwon中发消息,客户端1没收到消息测试了几次,只有客户端2也连接A实例发消息才能被客户端1收到

追踪一下主题看看详细的日志?这是 日志追踪 文档。

2023-01-11T14:01:45.146585+08:00 [info] back2_1673415402000@183.17.228.201:41664 PUBLISH to p7/down: <<“{\n "msg": "hello"\n}”>>
我在A,B实例都开启 Topic 日志追踪,然后客户端2向主题发消息,只有B实例出现上面日志,A实例没有日志,我客户端连接的时候都使用的是A、B实例的Ip,而不是nginx的,是不是客户端连nginx所在ip才能实现订阅共享,因为nginx负载到A、B两台实例

./bin/emqx_ctl cluster status

你执行这个命令看看集群是否成功。

是成功的,很奇怪,如果我用java客户端连服务器,必须要使用nginx地址,主题才能共享,但我用你们管理后台工具里面的websocket连接,直接使用A,B实例的IP去连接主题是能共享的。

你用 MQTT X 试试呢?

可以共享,除了java客户端

emqx-4.4.10-otp24.1.5-3-el7-amd64.rpm安装后,服务器消息持久化在哪个目录呀

开源版目前未提供消息持久化功能。

但开源版不是也能发消息么,如果要保证qos的1和2等级,客户端和服务器应该会将消息存在磁盘或内存吧,还是说开源版发送消息qos等级只能为0

开源版会把消息缓存在内存中的。

但我使用java客户端持久化选择MqttDefaultFilePersistence,没报错,且发消息也成功了

这是在客户端侧的消息持久化,或者说是在会话过期前的持久化。

EMQX 同样支持持久会话,支持开源版的实现是基于内存的,只要 EMQX 不停止运行,你就可以正常使用持久会话的所有能力。

我懂你意思了,你们开源emqx服务端侧不支持磁盘持久化,但客户端内存和磁盘持久化都行

是的 :smile: