2011-10-05 104 views
17

在一個web應用程序中,如果我需要將一個事件寫入一個隊列,我會建立一個到redis的連接來寫入事件。redis pub/sub模型是否需要持久連接到redis?

現在,如果我想要另一個後端進程(比如守護進程或cron作業)來處理或響應redis中的事件發佈,那麼是否需要持久連接?

對這個pub/sub過程如何在Web應用程序中工作一點困惑。

+0

某些簡單(1行修補程序)的想法在Redis中本地添加PubSub的持久性 - http://abhinavsingh.com/customizing-redis-pubsub-for-message-persistence-part-2/ –

回答

2

我不完全確定,但我相信是的,pub/sub需要持久連接。

對於另一種方法,我會看看resque以及它如何處理。它不是使用pub/sub,而是簡單地將項目添加到redis中的列表中,然後無論您使用哪個守護進程或cron作業都可以使用lpop命令獲取第一個。

對不起,只給出一個僞答案,然後一個插件。

42

基本上有兩種不同的消息模型:

  • 消防和忘記/一對多:發佈/訂閱。當消息被髮布時,所有的訂閱者都會收到它,但是這條消息會永遠丟失。如果一個客戶沒有訂閱,那麼它就無法取回它。
  • 持久隊列/一對一:列表,可能與阻塞命令(如BLPOP)一起使用。通過列表,您可以將生產者推入列表中,並且有一個或多個消費者正在等待元素,但是一條消息只會到達其中一個等待客戶端。通過列表你有持久性,消息將等待客戶端彈出它們而不是消失。因此,即使沒有人在聽,仍有積壓(與可用內存一樣大,或者您可以使用LTRIM限制積壓)。

我希望這是明確的。我建議你學習下面的命令來了解更多關於Redis的和消息語義:

  • LPUSH/RPUSH,RPOP/LPOP,BRPOP/BLPOP
  • 發佈,訂閱,PSUBSCRIBE

文檔此命令可在redis.io

+0

所以我需要持久連接作爲訂戶? – codecompleting

+5

與Pub/Sub,是的。看看[這個](http://blog.joshsoftware.com/2011/01/03/do-you-need-a-push-notification-manager-redis-pubsub-to-the-rescue/)爲例關於如何使用Pub/Sub和自定義ruby客戶端實現持久消息。 – cbrauchli

相關問題