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ā)送一條延時隊列,重新處理。
經(jīng)過查看github上的examples拿到頭緒,再次感謝walkor,examples上寫的比手冊詳細很多,而且每種模式都有寫的。
通過自己調(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做隊列留下的思維。