首页 > 解决方案 > 如何在 Google Cloud Platform 中设置长时间运行的 Django 命令

问题描述

我最近将我的网站移至 Google Cloud Run。

问题是我还需要在容器内移动一些每天运行 Django 命令的 cron 作业。如果我不想为始终运行节点实例的完整 Kubernetes 集群付费,那么首选的方法是什么?

我希望任务运行,然后关闭服务器,就像 Cloud Run 在收到传入请求时所做的那样。我已经搜索了所有文档,但是在为不需要 Google Cloud 中的底层服务器的容器中长时间运行的任务找到正确的解决方案时遇到了麻烦。

有人可以指出我正确的方向吗?

标签: djangogoogle-cloud-platformcron

解决方案


Cloud Run请求超时限制为15 分钟

Cloud Functions函数超时限制为540 秒

对于长时间运行的任务,在需要时上下旋转计算实例将是更优选的选择。


此处很好地解释 了如何自动调度、运行和停止计算实例的示例:使用 Cloud Scheduler 调度计算实例

简而言之:实际实例启动/停止由Cloud Functions. Cloud Scheduler在时间表上将所需的任务发布到Cloud Pub/Sub触发这些功能的队列中。您在主逻辑末尾的代码也可以发布消息Cloud Pub/Sub以运行Stop this instance任务。


如何在 Django 中处理任务?

  • 它可以是与 wsgi 服务器启动的同一个django 应用程序来处理传入请求(如常规 django 站点),但是请求/响应/其他超时增加,wsgi 工作人员寿命长...... - 在这种情况下,任务是对 django 视图的常规 http 请求

  • 它可以只是在云实例启动时运行的一个脚本(或django 管理命令)来自动执行一项任务

  • 您可能还想为任​​务传递额外的参数,在这种情况下,您可以发布到Cloud Pub/Sub一个Start instance任务,以及一个main logic带有自定义参数的任务,并让您的代码从Pub/Sub第一个拉取

  • 更多 django-native - 使用Celery并单独启动 celery workerCompute Instance


如何仅使用一个 Celery worker 而不使用所有其他部分(即代理(没有官方内置的 Cloud Pub/Sub 支持))以及向 Cloud Pub/Sub 拉/推任务的一种可能选择:

  • 使用虚拟文件系统代理运行 celery worker
  • 添加目标方法,@periodic_task即每 30 秒运行一次
  • 在任务开始时 - 订阅 Cloud Pub/Sub 队列,检查新任务,接收一个并开始处理
  • 在任务中 - 发布到 Cloud Pub/Sub 结果并调用Stop this instance

还有Cloud Tasks(超时限制:自动启动 - 10 分钟,手动启动 - 24 小时)作为 Cloud Run 对异步任务的补充,但在这种情况下 Cloud Pub/Sub 更合适。


推荐阅读