http://www.wtbis.cn/plugin/12
下面是webman 官方插件的一些說明:
消費失敗重試
如果消費失敗(發(fā)生了異常),則消息會放入延遲隊列,等待下次重試。重試次數(shù)通過參數(shù) max_attempts 控制,重試間隔由
retry_seconds 和 max_attempts共同控制。比如max_attempts為5,retry_seconds為10,第1次重試間隔為1*10秒,第2次重試時間間隔為 2*10秒,第3次重試時間間隔為3*10秒,以此類推直到重試5次。如果超過了max_attempts設(shè)置測重試次數(shù),則消息放入key為{redis-queue}-failed的失敗隊列。
注意
消費過程中沒有拋出異常視為消費成功,否則消費失敗,進入重試隊列
因為redis沒有ack 模式,
1.能否故意把某個隊列拋出為異常(目的是為了丟進重試隊列)
2.又或者能不能主動把某條隊列丟入重試隊列
因為我的隊列消費時的工作場景為:curl 攜帶XX參數(shù),訪問一個異步通知地址,當整個地址返回的內(nèi)容為:success 代表消費成功,否則丟入重試隊列(xx秒后重試 - 一共重試5次)
rabbitmq 的stomp是符合我的使用場景的,搞了兩天了都沒搞定這玩意 太難了!
什么都搞好了,投遞消息就提示:Stomp client: not_found
放棄了 搞redis-queue
使用 throw new \Exception();不就好了嗎
判斷返回地址,不符合要求就調(diào)用 throw new \Exception('xx不符合,重試'); 就完了,這句話就是手動拋異常的.這樣它就會判斷隊列執(zhí)行失敗,等會就會再重新執(zhí)行了
我試了一下并不行,產(chǎn)生一堆垃圾信息
我給個思路吧,也是現(xiàn)在在用的,不使用提供的失敗隊列,沒有得到需要的結(jié)果重新將任務(wù)發(fā)送到隊列內(nèi),如果執(zhí)行有異常則catch住后重新將任務(wù)發(fā)送到隊列內(nèi),自己記數(shù),超過了設(shè)定的次數(shù)都未得到需要的結(jié)果則丟棄(即不再送入隊列),同時記錄日志,通知系統(tǒng)有處理失敗的任務(wù)
// 隊列名
public $queue = '/topic/send_mail';
// 連接名,對應(yīng) config/redis_queue.php 里的連接`
public $connection = 'default';
// 消費
public function consume($data)
{
// 無需反序列化
//var_export($data); // 輸出 ['to' => 'tom@gmail.com', 'content' => 'hello']
throw new \Exception('異常消息');
}
我現(xiàn)在的做法是:
1.
在消費過程中,如果失敗了,則手動拋出異常,讓該任務(wù)進入原隊列,等待重新執(zhí)行
2.
如果最終超過重試次數(shù),則進入失敗隊列
3.
為了防止失敗隊列中的任務(wù)堆積 和 監(jiān)控失敗的任務(wù)
在整個服務(wù)啟動的時候,單獨起一個自定義進程
在進程啟動的時候,開啟一個定時器
每5秒(時間自定義,我目前設(shè)置的是每5秒執(zhí)行一次),從失敗隊列中,取出一個失敗的任務(wù)
把這個任務(wù)所有的數(shù)據(jù)(包括任務(wù)本身 和 異常堆棧),入庫(一個專門存放失敗任務(wù)的表)
4.
在后臺,開一個頁面,可以看到這個表里的數(shù)據(jù),也就是所有失敗的任務(wù)
在這個頁面,根據(jù)任務(wù)失敗的原因,可以選擇