1. 程式人生 > 其它 >redis實現訊息消費確認(ack機制)

redis實現訊息消費確認(ack機制)

前言

訊息中介軟體有很多,例如 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。這些訊息系統都很專業,無論是可靠性,容錯性,高效能都有自己獨特的特點,那為什麼我們還要用redis做訊息佇列

為什麼用redis做訊息佇列

擁有普通訊息元件的特性

  • redis的list,set等集合都支援pop,push這些出棧入棧的操作,詳見 redis命令
  • redis支援訂閱釋出模式
  • 能依靠雙佇列實現訊息確認模式

輕量易用

搭建一個mq需要你學習它,有的mq搭建還不是那麼容易,但是redis很方便搭建,用的人多,學習成本也低

省錢省力省時

一般的公司都有redis方面的應用,例如做快取,我們就不需要額外的伺服器資源來重新搭建mq,對於開發人員來說,學習redis很簡單,大多數也用過,開放起來很輕鬆也很快。

redis實現訊息確認 ack機制

像RabbitMQ這種訊息佇列一般都有先消費再commit提交確認消費的機制,而kafka也可以通過提交偏移量來實現ack:Kafka ack消費確認-提交和偏移量

如何用redis實現訊息釋出和消費

使用list,set等集合的 pop和push就能快速實現實時的訊息消費和釋出。例如redis List(列表) 的 LPUSH 和 RPOP

redis如何實現訊息確認 ack

什麼是ack

ACK的全稱為Acknowledge character,即確認字元,表示接收到的字元無錯誤。意思就是我把訊息處理完了我再告訴mq,我業務邏輯都搞完了,你伺服器可以把這條訊息刪了。這就是為了防止訊息丟失,防止業務層消費了訊息,而沒把活幹完。

redis實現ack的原理

維護兩個佇列,假如一個訊息佇列的key叫做task,另外一個佇列的key是doing表示正在處理的任務
每次消費task的訊息的同時就放到doing佇列
處理完訊息就刪除doing對應的訊息
使用定時任務檢查doing佇列,檢查訊息中的時間屬性(這個需要產生訊息的時候就可以加入時間戳),如果超時就把訊息回滾到task佇列
redis適合一般的業務系統,而像大資料處理系統,日誌收集,就需要類似kafka這種大名鼎鼎的MQ!