带有redis的可恢复PUB/SUB

Sam*_*ron 6 redis

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

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

有一拧不过,我想我的积压上限为一些数字,这意味着有故障的用户应该能够恢复达N个消息.

简单的解决方案是:

  1. Publisher发布消息X.
  2. X被推到列表中 RPUSH list message
  3. 对消息进行编码以在列表中包含其索引
  4. 消息发布给消费者(嵌入了索引) PUBLISH channel encoded

如果消费者需要重新建立:

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

到目前为止,我们都很好.

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

有什么方法可以保持不断增加的索引和列表中的封顶积压吗?

jak*_*ber 6

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

LPUSH list message
LTRIM list 0 N
INCR global_index
PUBLISH channel global_index
Run Code Online (Sandbox Code Playgroud)

当通过pub/sub接收消息并在启动时,客户端需要将其最新索引(也可以保存在redis或其他地方)与global_index和读取min(global_index - my_index,N)消息进行比较赶上(基本上LRANGE list 0 (global_index - my_index)).