我们目前的设计
环境:Redis 2.8.17
我们实现了一个可靠队列,使用与 Redis 文档中描述的类似模式,在 RPOPLPUSH 下。
但是,为了考虑到其阻塞特性,我们使用BRPOPLPUSH,并使用LPUSH 来确保先进先出(FIFO)顺序。
生产者: 多个线程(来自多台服务器)使用LPUSH将项目推入队列。
消费者: 多个线程(来自多台服务器)使用BRPOPLPUSH来处理项目。
BRPOPLPUSH q processing-q
如文档所述,redis会从队列'q'中弹出项目,并将它们添加到'processing-q'中。
问题
由于我们的应用程序是多线程(异步)的,因此我们无法控制何时消费者将完成其处理。
因此,如果我们使用LREM(根据文档)从processing-q中删除已处理的元素,则这只会删除processing-q的顶部元素,而不保证已删除相应消费者处理的实际元素。
因此,如果我们什么都不做,processing-q将继续增长(占用内存),这在我看来非常糟糕。
有任何建议或想法吗?