国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

【已解決】使用workerman/rabbitmq寫消費者,捕獲到異常時,無法正常消費

dkou

問題描述

我希望的消費者業(yè)務(wù)流程時:

1)先從隊列拿一條信息出來,先處理(ack)掉,無論業(yè)務(wù)邏輯成不成功
2)信息放到處理業(yè)務(wù)程序去處理。

要問的問題

如果業(yè)務(wù)程序中途出現(xiàn)異常,或者程序中途kill掉,發(fā)現(xiàn)隊列中這條信息還在(或者ack不成功?)
如果進程正常跑沒有異常或kill隊列的信息是能正常消費的。

應該怎么改才能滿足我的業(yè)務(wù)流程???????????

貼一下代碼希望大佬指點指點

截圖

備注:說說為啥要先處理信息

我的思路是,無論這條信息對應的業(yè)務(wù)是否成功,消息都要處理,防止隊列數(shù)據(jù)一直卡著。如果業(yè)務(wù)處理不成功,我會重新向隊尾發(fā)送一條延時隊列,重新處理。

1044 3 1
3個回答

SillyDog

Bunny\Channel::consume 這個方法 有個noack 參數(shù) 默認為 false 改為true 看看

  • dkou 2024-02-23

    試過了,設(shè)置true的話,只要中途進程斷了,隊列里面所有信息都會清空了

owenzhang

不懂問下。你這個die()不會導致workerman退出嗎?

  • nitron 2024-02-23

    旁邊不是注釋"模擬捕獲異?;蜻M程被kill"么

  • dkou 2024-02-24

    模擬異常

dkou

問題已自行解決

經(jīng)過查看github上的examples拿到頭緒,再次感謝walkor,examples上寫的比手冊詳細很多,而且每種模式都有寫的。

問題的關(guān)鍵:

通過自己調(diào)試發(fā)現(xiàn),上述寫法是流程是,先把隊列信息批量取出來,處理,然后再一次性ack的,即假設(shè)隊列有10條信息,會看到10條信息狀態(tài)會先變成Unacked,等10條信息對也業(yè)務(wù)邏輯完,這10條信息才會消失。
因此,如果我在處理第3條時die()了,其實前2條隊列信息是還沒收到ack的,所以隊列信息還在。
而我的要求,是要逐條信息處理,每條信息處理完就ack的,因此,應該要設(shè)置每次批量獲取信息的數(shù)量,設(shè)置為1。以下是代碼
截圖

題外話

經(jīng)指點,我這種“無論這條信息對應的業(yè)務(wù)是否成功,消息都要處理,防止隊列數(shù)據(jù)一直卡著。如果業(yè)務(wù)處理不成功,我會重新向隊尾發(fā)送一條延時隊列,重新處理?!碧幚矸绞皆趓abbitmq其實沒必要的,因為本來就有ack機制,unacked的隊列,會自己回到reday,不會被刪除。因為以前使用redis做隊列留下的思維。

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??