[已解决]MQTT订阅消息丢失

wxvirus

workerman-mqtt版本

{
    "name"  : "workerman/mqtt",
    "type"  : "library",
    "homepage": "http://www.workerman.net",
    "license" : "MIT",
    "require": {
        "workerman/workerman" : ">=3.3.0"
    },
    "autoload": {
        "psr-4": {"Workerman\\Mqtt\\": "./src"}
    }
}

运行暂无问题,就是运行了有好大半年了,突然发现有一部分数据未收到;服务端和订阅端都是QOS=2

订阅端代码

use Workerman\Worker;

$worker = new Worker();
$worker->onWorkerStart = function () {
    $options = ['client_id' => 'xxx', 'reconnect_period' => 1, 'username' => 'xxx', 'password' => 'xxx', 'debug' => false];
    $mqtt = new Workerman\Mqtt\Client(MQTT_ADDR, $options);
    $mqtt->onConnect = function ($mqtt) {
        do_log('Connected to MQTT broker');
        $mqtt->subscribe('topic', ['qos' => 2]);
    };
    $mqtt->onMessage = function ($topic, $content) {
        do_log('开始处理消息');
        procMsg($topic, $content);
    };
    $mqtt->connect();
};
Worker::runAll();

function procMsg($topic, $msg)
{
    do_log('msg: ' . $msg);
    // 做了一点业务: 将消息数据插入到表里
    // 这里可能有点问题,因为自己写的是每次都new一个PDO,现在准备改掉,但是不知道是否和这个有关
}

也没报错也没啥异常;对方也有一台机器也是订阅的,但是他们有数据,我这没数据,也不知道是不是有这种"多个订阅方同时订阅同一个主题时,某个订阅方可能会丢失消息"的问题,因为我们都调整过都是qos=2,请大佬们指点下查找思路和解决思路

已解决

原因:

  1. ps -ef | grep的时候随便填了个有点关系的关键字没搜到全部进程,没有kill掉全部的,再进行重启,导致部分进程还在跑以前的代码,导致一会日志记录现在的内容一会是记录以前的内容;
  2. 处理消息业务部分,没在意业务已经换库了(大半年没改过了,忘了),把自己本地的链接覆盖上去了,导致一直处于 SQLSTATE[HY000] [2002] Connection refused
838 0 0
0个回答

🔝