Go语言 由于同时重新启动多个Pod,因此限制任务多次运行

b5lpy0ml  于 2023-02-20  发布在  Go
关注(0)|答案(1)|浏览(146)

我是新来的Kubernetes,一直卡在一个点上。
比方说,我有多个pod,我有一些任务正在运行,当pod由于某种原因突然停止时,我将任务的状态保存在某个数据库中(终止但未完成),所以假设我有10个终止的任务,我想在pod重新启动时重新启动那些任务。如果多个pod重新启动,它们都将从数据库中取出终止的任务,使状态为“进行中”,所有任务都将启动。因此,任务将启动一次,它将启动多次,因为多个pod已发现它终止。我不想在数据库上应用锁,因为它会减慢我的代码。那么,如何限制只有一个pod来获取终止的任务并只启动一次呢?
仅供参考,我正在努力实现在Golang的任务重新启动。

vbopmzt1

vbopmzt11#

将任务的状态存储在数据库中,当pod终止时,将状态更新为“已终止”。然后,当pod再次启动时,查询已“已终止”且需要继续的任务。为其中一个任务获取随机ID,并执行UPDATE事务以将状态更新为“正在运行”(确保还包括WHERE status = 'terminated')。SQL中的单个UPDATE操作默认为原子操作,这意味着在该行被更新时没有其它事务可以修改该行。使用ORM(如GORM)时,您将得到一个包含修改行数的结果。如果行数不等于1,则表示另一个Pod已更新此任务。因此我们应该获取另一个ID并重试,直到执行更新行数为1的UPDATE。
这只是一个想法,不能保证这将为您工作,因为我不知道您的技术栈的全部范围(什么数据库,ORM等)。

相关问题