【发布时间】:2015-03-15 05:11:58
【问题描述】:
我们目前的设计
环境 Redis 2.8.17
我们已经实现了我们的可靠队列,使用类似于 redis 文档中描述的模式,RPOPLPUSH
但是,考虑到它的阻塞性质,我们使用 BRPOPLPUSH,并使用 LPUSH 来确保 FIFO 顺序。
生产者:多个线程(来自多个服务器)使用 LPUSH 来推送项目。
消费者:多个线程(来自多个服务器)使用 BRPOPLPUSH 来处理项目。
BRPOPLPUSH q processing-q
如文档所述,redis 从队列 'q' 中弹出项目,同时将它们添加到 'processing-q' 中。
问题
由于我们应用程序的多线程(异步)特性,我们无法控制消费者何时完成他们的处理。
因此,如果我们使用 LREM(根据文档)从 processing-q 中删除已处理的元素>,这只会删除 processing-q 的顶部元素。由于无法保证,它是否已删除由相应 consumer 处理的实际元素。
因此,如果我们不做任何事情,processing-q 会继续增长(消耗内存),恕我直言,这是非常糟糕的。
有什么建议或想法吗?
【问题讨论】:
-
这是一个很好的演示文稿,标题为 Redis as a Reliable Work Queue 和 presenter's blog post,主题相同。它解释了在 Redis 中建模的一种比在 RPOPLPUSH 文档中更高级的队列设计。还提到了故障恢复活动。
标签: redis queue reliability