我们有一些带有给定TTL的Redis密钥,我们想订阅并在TTL到期后采取行动(一个作业调度程序)。
这在单主机环境中运行良好,当您在ServiceStack中使用其Redis客户端订阅'__keyspace@0__:expired'
时,该服务将选择它并采取措施。太棒了......
...直到您设置了高可用性拓扑,在该群集中有多个API实例。然后,每个主机似乎都在接收该消息并可能使用它。
我知道密钥空间通知与传统的pub / sub或消息层事件完全不同,但有没有办法对这些事件执行某种确认,以便最后当天,只有一位主持人会继续执行任务?
否则,有没有办法延迟邮件发布?
谢谢!
答案 0 :(得分:1)
我对您的问题的理解:只要密钥过期,您就需要基于事件的单播通知。
如果上述假设正确,此解决方案将对您有所帮助。这是一种原始的解决方案,但有效!
<强>解决方案:强> 不知何故,你必须使用 Redis List / queue ,并以某种方式将过期的密钥放在redis列表中。然后在此列表中阻止 B * POP 操作将为您提供所需内容!
它是如何运作的? 假设,单个后台线程将持续将过期的密钥推送到redis列表/队列中。 API实例集群将在此列表/队列上调用阻塞弹出。
因为,只有一个客户端会消耗每个redis列表项的pop操作,只有一个API实例会获得过期密钥的通知!!!
<强>价:强>
列出弹出操作:https://redis.io/commands/lpop
与pub / sub类似的问题:Competing Consumer on Redis Pub/Sub supported?
答案 1 :(得分:1)
如https://redis.io/topics/notifications
中所述 <块引用>Redis 集群的每个节点都会生成关于它自己的键空间子集的事件,如上所述。但是,与集群中的常规 Pub/Sub 通信不同,事件的通知不会广播到所有节点。换句话说,键空间事件是特定于节点的。这意味着要接收集群的所有键空间事件,客户端需要订阅每个节点。
因此客户端应该创建到每个节点的单独连接以获取 redis 键空间通知。