消息隊列的Redis實現
05-14
不同的程序之間需要有序的信息交換,消息隊列就是其中的渠道,它連接著上游和下游。
上游是生產者或發布者,下游是消費者或訂閱者。
消息隊列有有兩種模式:
一種是生產-消費模式:生產者把消息放在隊列中,多個消費者監聽隊列,但只能有一個消費者搶走消息。
一種是發布-訂閱模式。發布者把消息放在隊列中,多個訂閱者都會收到同一份消息。
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