redis中如何有效使用zset进行调度任务处理

问题描述 投票:0回答:1

我们有一个用例,我们需要在不同的时间戳安排 jobs,直到它成功完成或达到 max attempts 为止。

我们正在考虑为此目的使用

redis
中可用的sorted sets

在每个新工作中,我们都会将

node[data(string), timestamp_to_execute(double) as score]
放入redis中的zset(名为'delay-queue')中。

我们将在应用程序的每个实例中运行很少的工作线程,它们会不断从 zset(延迟队列)中轮询得分最高的作业。如果

[score <= currentime.millis()]
我们将执行该作业并将其从 zset 中删除,否则我们等待一段时间并再次检查。

  1. 我们不希望一个作业执行两次,因为我们有多个应用程序实例在运行,我们如何确保一个应用程序实例选择的作业不应该被其他应用程序实例选择执行。

  2. 我们只是在评估一些边缘情况:如果我们将来有一些作业要在 redis zset 上执行,但是说 redis 宕机或者 zset 中的数据被刷新或删除。工作会丢失,我们如何确保这种情况不会发生。在这种情况下使用 redis zset 是正确的选择吗?

redis taskscheduler zset
1个回答
0
投票

从ZSET接工作有两个步骤:

  1. 检查ZSET中的最低分数是否小于当前时间
  2. 如果校验成功,弹出ZSET中的最小项

要防止一个工作被多个应用程序选中,您有以下选择:

如果想防止Redis宕机时数据丢失,可以配置Redis将数据持久化到磁盘:https://redis.io/docs/management/persistence/

看你的数据有多重要,如果数据非常关键(比如账户间转账),我认为使用Kafka更适合这种情况。

更新:

重新考虑后,Kafka 可能不适合你的情况。您需要一个有序集,但 Kafka 的功能更像是一个消息队列。您可以坚持使用 Redis 解决方案。如果您需要更多的数据安全性,使用数据库也是一种选择。您可以将工作保存在表中并使用数据库事务来确保一次只有一个应用程序可以选择工作。

© www.soinside.com 2019 - 2024. All rights reserved.