当redis消息队列出现{redis-queue}-failed,后面将不再消费

掌柜

问题描述

为了提高API的并发能力,我将一个文章接口的请求增加阅读量views字段的工作放进了消息队列中。
但有时进行代码的更迭的时候,redis-queue的队列还没有完成消费,就会变为failed放进同一个key中,之后消费就会卡住,这个key中后面会追加到无限大。
有什么办法可以避免这种情况?

为此你搜索到了哪些方案及不适用的原因

// queue
class ViewsUpdateSend implements Consumer
{
    // 要消费的队列名
    public $queue = 'zrViews';
    // 连接名,对应 plugin/webman/redis-queue/redis.php 里的连接`
    public $connection = 'default';
    // 消费
    public function consume($data)
    {
        // 获取ID
        $id = explode(',', base64_decode($data))[0];
        // 增加浏览量
        Article::find($id)->increment('views');
    }
}
// 控制器
            //判断文章是否存在
            if (!$article) {
                $data = json_encode([
                    'code' => 0,
                    'msg' => '暂无内容',
                ]);
            } else {
                Client::send('zrViews', $i);
258 1 0
1个回答

latin

失败会有日志,从{redis-queue}-failed取出来几条看下日志,不会无缘无故失败,失败原因找到解决就好了吧。
你日志都没贴出来

  • 掌柜 2024-09-26

    正常没有失败,失败原因刚刚说了呀就是更新代码时候对列没有消费完,这个时候第一条就会failed,之后后面的就会堵塞,也没有办法编辑key把第一条删掉,因为队列不断在扩大长度,只能删除整条key,这样后面就正常了。

  • latin 2024-09-26

    {redis-queue}-failed 里面放的是所有失败队列及日志,还要看具体日志。{redis-queue}-failed后面会追加到无限大说明一直在消费,但是因为某种原因失败了,还是要看日志为什么失败

  • 掌柜 2024-09-26

    我下次更新代码时候看一下日志,感谢回答

×
🔝