為了解決組內(nèi)消息讀取但處理期間消費(fèi)者崩潰帶來的消息丟失問題,STREAM 設(shè)計(jì)了 Pending 列表,用于記錄讀取但并未處理完畢的消息。命令XPENDIING 用來獲消費(fèi)組或消費(fèi)內(nèi)消費(fèi)者的未處理完畢的消息。演示如下:
每個Pending的消息有4個屬性:
消息ID
所屬消費(fèi)者
IDLE,已讀取時長
delivery counter,消息被讀取次數(shù)
上面的結(jié)果我們可以看到,我們之前讀取的消息,都被記錄在Pending列表中,說明全部讀到的消息都沒有處理,僅僅是讀取了。那如何表示消費(fèi)者處理完畢了消息呢?使用命令 XACK 完成告知消息處理完成,演示如下:
有了這樣一個Pending機(jī)制,就意味著在某個消費(fèi)者讀取消息但未處理后,消息是不會丟失的。等待消費(fèi)者再次上線后,可以讀取該P(yáng)ending列表,就可以繼續(xù)處理該消息了,保證消息的有序和不丟失。