共享订阅无法接收到数据

初次使用emqx,想使用一下共享订阅的功能。测试发现无法接受到信息,不知是否配置错误

环境信息

  • EMQ X 版本:4.3.7
  • 操作系统及版本:windows
  • 其他
    测试工具:mqttx,mqtt.fx

问题描述

测试订阅3个主题分别为:
$queue/topic
$share/group/topic
topic
然后向主题topic发送数据,发现只有topic这个订阅主题收到数据,其他两个共享订阅没有。

另外发现,使用$queue订阅在Dashboard订阅列表会显示成$share/$queue/topic,不知什么原因

经过多次测试发现,应该是客户端问题
下面用mqtt.fx mqttx phpmqtt 都订阅相同话题,如下

接收到的消息如下,只有mqttx收到了消息



具体原因还要再检查一下

$queue/topic 这个是共享订阅,你可以理解带群组为queue的共享订阅。共享订阅,每组中一条消息只有一个客户端接收消息。你这边提到常规订阅和共享订阅混合,常规订阅的每个客户端都能收到消息,共享订阅的客户端也是同时可以接收到消息。你这边的现象是否能提供更多场景供我们重现呢

mqtt.fx 不支持共享订阅,建议使用 MQTTX 进行测试。

对,就是这个问题。发现只有mqttx支持共享订阅

已经解决了,客户端问题。只有mqttx能收到共享订阅的消息,其他客户端收不到

问题已经解决,客户端问题。
因为我使用的是phpmqtt,debug查看了下,提示msg received but no match in subscriptions。
没有匹配到,那么就是有数据发过来,程序没解析成功。
既然能接收到数据,那就好办了。
看了下源码,


匹配的代码在这里,然后再调试了一下,修改成这样

添加了两行代码,把共享订阅的标识去掉就能匹配到了。

      //群组共享订阅
            $key =  preg_replace('/^\$share\/(.*?)\//',"",$key);
            //非群组共享订阅
            $key =  preg_replace('/^\$queue\//',"",$key);

因为不怎么会正则就简单弄了下,正常应该是匹配规则里面添加匹配共享标识符,而不是删掉共享订阅标识符,会的大佬可以优化一下。

先这样,其他客户端应该也是这个问题,也可以优化一下。

另外有意思的,非群组共享订阅那个我以为是BUG,其实不是。
$share/$queue/topic
如果所有$queue都变成$share/$queue,那不就是分到一个群组里面了,这可太简单粗暴了

1 个赞

$share 设计初衷就是为了提供一个全局共享订阅入口,把它当作一个特殊的 group 即可