我们有一个用例,我们需要在不同的时间戳安排一个 job,直到它成功完成或达到 max attemts 为止。
我们正在考虑为此目的使用
redis中可用的
sorted sets
。
在每个新工作中,我们都会将
node[data(string), timestamp_to_execute(double) as score]
放入redis中的zset(名为'delay-queue')中。
我们将在应用程序的每个实例中运行很少的工作线程,它们会不断从 zset(延迟队列)中轮询得分最高的作业。如果
[score <= currentime.millis()]
我们将执行该作业并将其从 zset 中删除,否则我们等待一段时间并再次检查。
我们不希望一个作业执行两次,因为我们有多个应用程序实例在运行,我们如何确保一个应用程序实例选择的作业不应该被其他应用程序实例选择执行。
我们只是在评估一些边缘情况:如果我们将来有一些作业要在 redis zset 上执行,但是说 redis 宕机或者 zset 中的数据被刷新或删除。工作会丢失,我们如何确保这种情况不会发生。在这种情况下使用 redis zset 是正确的选择吗?