登录
首页 >  Golang >  Go问答

限制任务运行多次,因为多个 Pod 同时重启

来源:stackoverflow

时间:2024-02-10 20:00:24 110浏览 收藏

本篇文章给大家分享《限制任务运行多次,因为多个 Pod 同时重启》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我是 Kubernetes 新手,一直陷入困境。

可以说,我有多个 Pod,并且正在运行一些任务。突然,当 Pod 由于某种原因停止时,我通过捕获 SIGTERM 信号或使用 TerminationGracePeriod 将任务状态保存在某个数据库中(已终止但未完成)。 因此,假设我有 10 个已终止的任务,我想在 Pod 重新启动时重新启动这些任务。如果多个 Pod 重新启动,它们都会从数据库中获取已终止的任务,使状态变为“In Progress”,然后所有 Pod 都会启动该任务。因此,任务不会启动一次,而是会启动多次,因为多个 Pod 发现它已终止。我不想在数据库上应用锁,因为它会减慢我的代码速度。那么如何限制只有一个 pod 来获取已终止的任务并仅启动一次。

仅供参考,我正在尝试实现Golang中任务的重启。


正确答案


将任务的状态存储在数据库中,当 Pod 终止时,您将状态更新为“终止”。然后,当 Pod 再次启动时,查询已“终止”且需要继续的任务。获取其中一项任务的随机 ID,然后执行 UPDATE 事务以将状态更新为“正在运行”(确保还包括 WHERE status =“termination”)。 SQL 中的单个 UPDATE 操作默认是原子的,这意味着在更新该行时没有其他事务可以修改该行。当使用像 GORM 这样的 ORM 时,你将得到一个包含被修改的行数的结果。如果行数不等于 1,则意味着另一个 pod 已经更新了此任务,因此我们应该获取另一个 ID 并重试,直到执行更新的行数为 1 的 UPDATE。

这只是一个想法,不能保证这对您有用,因为我不知道您的技术堆栈的全部范围(什么 DB、ORM 等)。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>