假设我的服务正在运行cron作业。但是在Kubernetes中将服务副本设置为2,这将导致cron作业在每个计划中运行两次。有什么设计建议来防止这种情况吗?对于运行服务的cron作业,我们应该只有1个副本吗?还是有其他方法?
我不知道是否有一个已知的标准,但我使用数据库上的锁定机制(或任何其他存储方式)解决了这个问题。cron函数将具有这样的锁检查机制:
- cron操作应该有一个少量的随机延迟时间,以便所有副本将在稍微不同的时间启动cron。
- 当cron启动时,它检查cron状态是否处于锁定状态(在数据库/存储上)。如果它被锁定,那么它将跳过操作。如果未锁定,则锁定状态,执行操作,然后解锁状态。
通过这种设置,您可以确保只有一个服务副本实际运行cron操作。