使用ServiceStack在分布式环境中使用Redis键空间通知订阅

时间:2017-01-09 03:46:56

标签: redis servicestack scheduling servicestack.redis

我们有一些带有给定TTL的Redis密钥,我们想订阅并在TTL到期后采取行动(一个作业调度程序)。

这在单主机环境中运行良好,当您在ServiceStack中使用其Redis客户端订阅'__keyspace@0__:expired'时,该服务将选择它并采取措施。太棒了......

...直到您设置了高可用性拓扑,在该群集中有多个API实例。然后,每个主机似乎都在接收该消息并可能使用它。

我知道密钥空间通知与传统的pub / sub或消息层事件完全不同,但有没有办法对这些事件执行某种确认,以便最后当天,只有一位主持人会继续执行任务?

否则,有没有办法延迟邮件发布?

谢谢!

2 个答案:

答案 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 键空间通知。