為了提高API的并發(fā)能力,我將一個(gè)文章接口的請(qǐng)求增加閱讀量views字段的工作放進(jìn)了消息隊(duì)列中。
但有時(shí)進(jìn)行代碼的更迭的時(shí)候,redis-queue的隊(duì)列還沒有完成消費(fèi),就會(huì)變?yōu)閒ailed放進(jìn)同一個(gè)key中,之后消費(fèi)就會(huì)卡住,這個(gè)key中后面會(huì)追加到無限大。
有什么辦法可以避免這種情況?
// queue
class ViewsUpdateSend implements Consumer
{
// 要消費(fèi)的隊(duì)列名
public $queue = 'zrViews';
// 連接名,對(duì)應(yīng) plugin/webman/redis-queue/redis.php 里的連接`
public $connection = 'default';
// 消費(fèi)
public function consume($data)
{
// 獲取ID
$id = explode(',', base64_decode($data))[0];
// 增加瀏覽量
Article::find($id)->increment('views');
}
}
// 控制器
//判斷文章是否存在
if (!$article) {
$data = json_encode([
'code' => 0,
'msg' => '暫無內(nèi)容',
]);
} else {
Client::send('zrViews', $i);
失敗會(huì)有日志,從{redis-queue}-failed取出來幾條看下日志,不會(huì)無緣無故失敗,失敗原因找到解決就好了吧。
你日志都沒貼出來
正常沒有失敗,失敗原因剛剛說了呀就是更新代碼時(shí)候?qū)α袥]有消費(fèi)完,這個(gè)時(shí)候第一條就會(huì)failed,之后后面的就會(huì)堵塞,也沒有辦法編輯key把第一條刪掉,因?yàn)殛?duì)列不斷在擴(kuò)大長度,只能刪除整條key,這樣后面就正常了。
{redis-queue}-failed 里面放的是所有失敗隊(duì)列及日志,還要看具體日志。{redis-queue}-failed后面會(huì)追加到無限大說明一直在消費(fèi),但是因?yàn)槟撤N原因失敗了,還是要看日志為什么失敗