基本上我的cron是每2分钟更新一次数据库。但我需要运行另一个cron更新数据库每24小时。我需要确保没有竞争条件,而第二个cron(每天)正在运行,即两个cron不能一起运行和重叠。这需要在Kubernetes集群中使用作业实现。
我的解决方案是每2分钟运行一次第一个cron,但是当第二个cron运行时延迟5分钟(每天)。
任何替代解决方案都是受欢迎的。
基本上我的cron是每2分钟更新一次数据库。但我需要运行另一个cron更新数据库每24小时。我需要确保没有竞争条件,而第二个cron(每天)正在运行,即两个cron不能一起运行和重叠。这需要在Kubernetes集群中使用作业实现。
我的解决方案是每2分钟运行一次第一个cron,但是当第二个cron运行时延迟5分钟(每天)。
任何替代解决方案都是受欢迎的。
3条答案
按热度按时间olqngx591#
我试着思考一些可能性,但事情可能会出错,主要是因为你有一个需要每2分钟运行一次的工作,让我们假设你的日常工作出于任何原因需要比你预期的更多的时间,一个新的2分钟工作将开始,这不可能发生。
最好的解决方案是在代码级别解决这个问题。您可以在应用程序中创建一个锁,以防止这些作业同时运行。
如果你真的无法在代码中找到解决这个问题的方法,Kubernetes上有一种机制可以阻止同一个cronjob启动新的作业。您可以设置标记spec.concurrencyPolicy:禁止,因此如果您的作业启动时间超过2分钟,则将跳过新作业。这不是一个全局标志,这只是每个cronjob。
您可以使用spec.initContainers聚合这种可能性,并找到一种在同一cronjob中运行这两个任务的方法。
initContainers是在应用容器之前运行的专用容器。
下面是一个示例:
这个清单定义了一个cronJob,它将每2分钟运行一次,并将启动一个initContainer(你的2分钟作业),还将每2分钟运行第二个容器。问题是,在第二个容器中,我们有一个shell脚本检查是否是午夜(忽略了秒数,因为我们不能确定它何时开始)。
您可能需要调优这部分代码:
让我们假设你的第一个容器需要一分钟以上的时间来执行,它将是00:01,你的第二个作业将永远不会被执行。
让我知道这些信息和解决方案是否对您有帮助。
f8rj6qna2#
你可以使用cron来表示时间,比如 */2 * 和0 1 *,当你在任何偶数时刻开始运行代码时,它永远不会冲突。
tjjdgumg3#
时间表:“5/2 *",您可以在www.example.com获得配置https://crontab.guru/#5/2_*_*****也有一个特殊的小时。我还建议验证timezone和securityContext。下面是一个例子: