具备恢复功能的Redis PUB/SUB

6
我正在构建一个由Redis支持的PUB/SUB系统。
我有一个发布者和大量的订阅者。订阅者不太可靠,他们随时可能失去连接,并需要能够从丢失的连接中“恢复”。
然而,有一个细节:我希望我的后备队列在某个数字上被限制,这意味着故障的订阅者应该只能恢复最多N条消息。
最简单的解决方案是:
1. 发布者发布消息X 2. X被推送到列表中:RPUSH列表消息 3. 消息被编码以包括其在列表中的索引 4. 消息被发布给消费者(嵌入了索引):PUBLISH通道编码
如果消费者需要重新建立连接:
1. 它原子地向Redis请求它已经拥有的索引之后列表中所有的值,并执行PSUBSCRIBE
到目前为止我们都很好。
我的重要问题是,如果我想将后备队列限制为N项,有没有办法保持不断增长的索引和列表中的限制后备?
1个回答

6
这个怎么样?要发布一条消息,可以这样做:
LPUSH list message
LTRIM list 0 N
INCR global_index
PUBLISH channel global_index

当接收到发布/订阅消息或启动时,客户端需要将其最新的索引(此可以存储在redis或其他地方)与全局索引进行比较,并从列表中读取min(global_index - my_index, N) 条消息来进行追赶(基本上就是 LRANGE list 0 (global_index - my_index))。


是的,我非常喜欢这个解决方案。 - Sam Saffron
我实现了这个,https://gist.github.com/4385544 不确定我的watch和multi的使用是否完全正确。 - Sam Saffron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接