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