使用webman/redis-queue 偶尔会出现入队成功了,但是没执行

wenhehe

问题描述

用的Redis::send同步投递方式,并且投递失败会记录日志。
消费队列消费成功或者失败也会记录日志
偶尔会出现没有投递失败的日志,但是某条队列似乎也没执行,也没有队列异常的日志,查看redis队列里也没有数据了

补充:
记录日志代码:
入队日志记录代码:
截图
消费队列日志:
截图
日志记录:
漏掉了393853,也没有入队失败的记录,消费队列也没有日志,是队列没进入成功吗
截图

05-22最新测试:

有记录到396483入队成功,却没有消费的记录
截图
下面是日志记录的代码:
投递队列记录日志:
截图
消费队列记录日志:
截图

5-22最新日志截图

截图

766 2 0
2个回答

walkor 打赏

redis里没数据就说明消息被取走执行了。或者redis没设置落地磁盘重启消息丢失了

  • wenhehe 2024-05-20

    大佬,redis没有重启,需要怎么排查这个问题,请教一下

  • walkor 2024-05-20

    记录日志,投递和消费都记录

  • wenhehe 2024-05-20

    好的,谢谢,我消费也记录下日志

  • wenhehe 2024-05-21

    消费也记录日志了,但是确实出现了,消费日志也没有,这种是什么情况呢

  • wenhehe 2024-05-21

    大佬,我把截图补充在问题里了

  • walkor 2024-05-21

    入队列也要记录日志

  • wenhehe 2024-05-21

    入队有记录日志了

  • walkor 2024-05-21

    截图下证明入队列了

  • wenhehe 2024-05-21

    Redis::send($queue, $queue_data);返回false或者抛异常都会记录,上面的截图有

  • wenhehe 2024-05-21

    Redis::send($queue, $queue_data);如果返回true能证明入队吗,我现在队列里找不到这条,时间也过去一个多小时了

  • walkor 2024-05-21

    不,你要证明393853入队列了,在Redis::send() 后记录。

  • walkor 2024-05-21

    还有,如果order_id是数据库里的某个表的字段,看下数据库里对应的order_id为393853数据是否存在。

  • wenhehe 2024-05-21

    393853数据在数据库是存在的

  • wenhehe 2024-05-21

    $queue_res = Redis::send($queue, $queue_data);
    if (!$queue_res) {
    Log::error($mer_id . '|' . $merchant_order_no . '|入队失败' . $queue_res);
    }
    Log::info('入队成功|'.$order_id);
    这样写能证明入队成功吗

  • walkor 2024-05-21

    能证明成功,但是不能证明 393853 那条执行过 Redis::send 入队列

  • wenhehe 2024-05-21

    文档上不是说投递成功Redis::send() 返回true,否则返回false或者抛出异常。我记录了返回值和捕获这个异常,如果都没有错误记录能确定入队成功吗,还是要怎么样才能确定入队成功呢

  • wenhehe 2024-05-21

    protected function execCommand($command, ...$args)
    {
    try {
    return $this->{$command}(...$args);
    } catch (\Throwable $e) {
    $msg = strtolower($e->getMessage());
    if ($msg === 'connection lost' || strpos($msg, 'went away')) {
    $this->connectWithConfig();
    return $this->{$command}(...$args);
    }
    throw $e;
    }
    }
    这个是写入redis的代码吗,如果抛出异常是否也会返回true被认定为入队成功?

  • walkor 2024-05-21

    抛异常不会返回true

  • walkor 2024-05-21

    如果是在控制器里投递消息,抛异常你没捕获的话框架会在rutime/logs/webman-xx.log 里记录日志

  • wenhehe 2024-05-21

    我在执行队列的方法处也有捕获了异常,但是没有记录到异常

  • wenhehe 2024-05-21

    Redis::send() 返回true能保证一定入队成功吗

  • walkor 2024-05-21

    保证

  • wenhehe 2024-05-21

    好的,那我在Redis::send()后记录下返回值,再消费队列记录下日志,这样再观察下情况

  • wenhehe 2024-05-22

    新的测试结果记录在5-22了,确实出现有入队了,Redis::send() 返回true,但是消费队列没有执行到

  • walkor 2024-05-22

    日志再往上截图一段,看到396482先出现了消费,后出现了入队列,顺序不对。
    另外执行 ps auxf,看下系统里是不是有其它消费进程开着没关闭,或者其它服务器有开着消费进程没关闭。

  • wenhehe 2024-05-22

    最新的日志已发出,日志上显示先消费后入队,是因为先执行入队,然后记录日志,队列也同时在那一秒执行了,并发写入日志导致出现顺序不对的吗?这个队列消费进程我是开了10个,没有别的消费进程了

  • wenhehe 2024-05-22

    这个情况也不是经常发生,有的时候几万条才会出现一次,有的时候几千条出现一次

  • walkor 2024-05-22

    截图
    看下其它日志文件例如 workerman.log 等这个时间点有没有什么日志出现

  • wenhehe 2024-05-22

    已检查过了,其他日志都没记录

  • walkor 2024-05-22

    看不出来什么问题,我本地用100万条测试了下,也没有丢失
    截图

  • wenhehe 2024-05-22

    好的,谢谢老大,我再测试下

  • wenhehe 2024-05-23

    老大,你在本地投入一百万条队列是一个进程处理投递队列,一个进程消费队列吗

  • walkor 2024-05-23

  • wenhehe 2024-05-26

    今天仔细检查了一下,好像是有入队,但是消费队列的代码执行一半就消失了,会有这种可能吗

aacsok

楼主,问题解决没?

  • 暂无评论
×
🔝