为了提高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);
失败会有日志,从{redis-queue}-failed取出来几条看下日志,不会无缘无故失败,失败原因找到解决就好了吧。
你日志都没贴出来
正常没有失败,失败原因刚刚说了呀就是更新代码时候对列没有消费完,这个时候第一条就会failed,之后后面的就会堵塞,也没有办法编辑key把第一条删掉,因为队列不断在扩大长度,只能删除整条key,这样后面就正常了。
{redis-queue}-failed 里面放的是所有失败队列及日志,还要看具体日志。{redis-queue}-failed后面会追加到无限大说明一直在消费,但是因为某种原因失败了,还是要看日志为什么失败
我下次更新代码时候看一下日志,感谢回答