带有redis的可恢复PUB / SUB

时间:2012-12-13 22:47:51

标签: redis

我正在构建一个由Redis支持的PUB / SUB系统。

我有一个发布商和大量订阅者。订户不可靠,他们可以随时丢失连接,并且需要能够从丢失的连接中“恢复”。

虽然有一个转折,我希望我的积压上限为某个数字,这意味着错误的订阅者应该能够仅恢复最多N个消息。

简单的解决方案是:

  1. Publisher发布消息X
  2. X被推送到列表RPUSH list message
  3. 对邮件进行编码以在列表中包含其索引
  4. 消息发布给消费者(嵌入了索引)PUBLISH channel encoded
  5. 如果消费者需要重新建立:

    1. 它要求redis获取索引后列表中的所有值并以原子方式执行PSUBSCRIBE

    2. 到此为止,我们都很好。

      我的一个大问题是,如果我希望积压清单上限为N项,该怎么办?

      有没有什么方法可以保持不断增加的索引和列表中的上限积压?

1 个答案:

答案 0 :(得分:6)

这个怎么样?要发布消息,请执行

LPUSH list message
LTRIM list 0 N
INCR global_index
PUBLISH channel global_index

当通过pub / sub接收消息并且启动时,客户端需要使用global_index和read min(global_index - my_index,N)消息比较他们的最新索引(这也可以保存在redis或其他地方)从列表中赶上(基本上LRANGE list 0 (global_index - my_index))。