用的Redis::send同步投递方式,并且投递失败会记录日志。
消费队列消费成功或者失败也会记录日志
偶尔会出现没有投递失败的日志,但是某条队列似乎也没执行,也没有队列异常的日志,查看redis队列里也没有数据了
补充:
记录日志代码:
入队日志记录代码:
消费队列日志:
日志记录:
漏掉了393853,也没有入队失败的记录,消费队列也没有日志,是队列没进入成功吗
有记录到396483入队成功,却没有消费的记录
下面是日志记录的代码:
投递队列记录日志:
消费队列记录日志:
redis里没数据就说明消息被取走执行了。或者redis没设置落地磁盘重启消息丢失了
大佬,redis没有重启,需要怎么排查这个问题,请教一下
记录日志,投递和消费都记录
好的,谢谢,我消费也记录下日志
消费也记录日志了,但是确实出现了,消费日志也没有,这种是什么情况呢
大佬,我把截图补充在问题里了
入队列也要记录日志
入队有记录日志了
截图下证明入队列了
Redis::send($queue, $queue_data);返回false或者抛异常都会记录,上面的截图有
Redis::send($queue, $queue_data);如果返回true能证明入队吗,我现在队列里找不到这条,时间也过去一个多小时了
不,你要证明393853入队列了,在Redis::send() 后记录。
还有,如果order_id是数据库里的某个表的字段,看下数据库里对应的order_id为393853数据是否存在。
393853数据在数据库是存在的
$queue_res = Redis::send($queue, $queue_data);
if (!$queue_res) {
Log::error($mer_id . '|' . $merchant_order_no . '|入队失败' . $queue_res);
}
Log::info('入队成功|'.$order_id);
这样写能证明入队成功吗
能证明成功,但是不能证明 393853 那条执行过 Redis::send 入队列
文档上不是说投递成功Redis::send() 返回true,否则返回false或者抛出异常。我记录了返回值和捕获这个异常,如果都没有错误记录能确定入队成功吗,还是要怎么样才能确定入队成功呢
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被认定为入队成功?
抛异常不会返回true
如果是在控制器里投递消息,抛异常你没捕获的话框架会在rutime/logs/webman-xx.log 里记录日志
我在执行队列的方法处也有捕获了异常,但是没有记录到异常
Redis::send() 返回true能保证一定入队成功吗
保证
好的,那我在Redis::send()后记录下返回值,再消费队列记录下日志,这样再观察下情况
新的测试结果记录在5-22了,确实出现有入队了,Redis::send() 返回true,但是消费队列没有执行到
日志再往上截图一段,看到396482先出现了消费,后出现了入队列,顺序不对。
另外执行 ps auxf,看下系统里是不是有其它消费进程开着没关闭,或者其它服务器有开着消费进程没关闭。
最新的日志已发出,日志上显示先消费后入队,是因为先执行入队,然后记录日志,队列也同时在那一秒执行了,并发写入日志导致出现顺序不对的吗?这个队列消费进程我是开了10个,没有别的消费进程了
这个情况也不是经常发生,有的时候几万条才会出现一次,有的时候几千条出现一次
看下其它日志文件例如 workerman.log 等这个时间点有没有什么日志出现
已检查过了,其他日志都没记录
看不出来什么问题,我本地用100万条测试了下,也没有丢失
好的,谢谢老大,我再测试下
老大,你在本地投入一百万条队列是一个进程处理投递队列,一个进程消费队列吗
对
今天仔细检查了一下,好像是有入队,但是消费队列的代码执行一半就消失了,会有这种可能吗
楼主,问题解决没?