消息隊列的Redis實現

不同的程序之間需要有序的信息交換,消息隊列就是其中的渠道,它連接著上游和下游。

上游是生產者或發布者,下游是消費者或訂閱者。

消息隊列有有兩種模式:

一種是生產-消費模式:生產者把消息放在隊列中,多個消費者監聽隊列,但只能有一個消費者搶走消息。

一種是發布-訂閱模式。發布者把消息放在隊列中,多個訂閱者都會收到同一份消息。

Redis本身具有發布訂閱功能。其缺陷是消息不能存儲,不能重發。如果訂閱者斷線,那麼重連之後,斷線期間發布的消息無法獲得。UPOS項目最初採用這種方式發布規則文件,除了上述缺點,當規則文件較大時(印象中是>5M),數據傳輸會佔用較大帶寬,這樣發布訂閱過程極不穩定。後來把規則文件直接存儲在redis中(含版本號),定時去檢查版本號,如果發現更新的規則文件,就會更新。

Redis的數據結構list作為生產消費模式的消息隊列。

list操作命令是RPOP,LPOP,RPUSH,LPUSH,BRPOP,BLPOP。最後兩個是阻塞命令,必須有timeout。

這種方案的缺點是,如果消費者拿到消息之後崩潰,那麼恢復之後不可能重新拿到消息。

BRPOPLPUSH source destination timeout

這種方案的改進版本是使用命令RPOPLPUSH / BRPOPLPUSH,這樣被取出的消息存儲在另一個列表中(備份)。等消費者處理完消息之後,再從備份列表中刪除。


推薦閱讀:

消息隊列的冪等性
消息隊列怎樣不丟消息?
Python操作rabbitmq系列(二):多個接收端消費消息
Kafka基礎概念
調用:RPC MQ

TAG:消息隊列 | Redis |