【问题标题】:CRON Jobs in container容器中的 CRON 作业
【发布时间】:2020-06-08 13:42:01
【问题描述】:

我有一个我写的服务器,它允许我们“启动”处理和/或管理 CRON 作业以按不同的时间表进行处理。

如果我以水平可扩展的方式运行容器,如何从崩溃的容器中恢复或通知新容器 CRON 作业正在由另一个容器处理?

我应该将我的 cron 作业定义及其状态存储在数据库中吗?如果是这样,如果容器崩溃并且没有机会将状态写入数据库,我该如何记录状态?

我应该将我的容器定义分解为一个单独的容器并且只运行一个吗?

【问题讨论】:

    标签: docker kubernetes cron amazon-ecs


    【解决方案1】:

    如果您希望您的应用程序代码是无状态的,那么是的,您需要将其存储在数据库中以适应容器崩溃。

    但是,我认为您是在问,如果容器崩溃,其他容器将如何接收并重试失败的 cron 作业。您现在正在考虑设计一个分布式作业调度程序。自行开发是一项大量工作,并且已经有 many off-the-shelf 解决方案。

    谢天谢地,您已经在运行分布式作业调度程序 Kubernetes!您可以利用 Kubernetes CronJob 功能。如果您configure your application to be able to talk to the Kubernetes API,您的应用程序可以创建 CronJob 对象,并将其余部分留给调度程序。

    【讨论】:

    • 不知道AWS ECS有没有类似的功能?
    • 啊,我认为问题是关于 Kubernetes 因为标签。我对ECS一窍不通,但是貌似有这个功能:docs.aws.amazon.com/AmazonECS/latest/developerguide/…
    • 谢谢。很多我不知道的很酷的开源分布式 cron 作业项目。看起来我还有更多的 Kubernetes 需要学习。与此同时,我可能会参加 Cloudwatch 活动。
    【解决方案2】:

    为什么你认为你需要做一些不同的事情只是因为你已经虚拟化了你的服务器?

    调度可能在/etc/cron.d 中,并且通过/run/ 中的pid 文件处于运行状态。只需将此目录与需要它的容器共享。如果多个操作相互依赖,则机制应该是基于事务的,就像正常的 cronjob 一样。

    更重要的是,你如何编排容器。

    我会有一个 cronjob-etc 容器,它会在正确的时间为每个作业启动一个新容器。当容器的作业不活动时,您不需要运行容器。

    如果您的作业少于 1000 个,则将有关调度/启动器容器的其他信息存储在 sqlite3 文件中就足够了。

    【讨论】:

    • 感谢您的意见。听起来您建议使用单独的容器来管理“工作”,如果我担心失去“工作”,那么我应该将它们的定义存储到数据库中。
    • 我知道您可以在 docker 中映射卷,但不知道/当您建议与多个容器共享文件系统的各个部分时,您确定您的意思是什么?对于更多上下文,我对编排很陌生。我只有 AWS ECS 方面的经验。
    • @JonVogel 作业本身应该在单独的容器中运行,是的。有关信息,您可以使用数据库或与多个容器共享卷。
    • 我将不得不为多个容器的卷共享提供一个文档阅读,我不知道。不过,我可能会坚持使用 AWS Cloudwatch 活动。
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2016-08-29
    • 2016-09-24
    相关资源
    最近更新 更多