2011-10-05 107 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

相关问题