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