如何防止长时间运行的后台任务在 Google Cloud Run 上停止?

问题描述 投票:0回答:2

我有一个 FastAPI 端点,它启动一些长时间运行的后台任务:

background_tasks.add_task(fn())

这些任务最多可能需要 10 小时才能完成。

我正在使用

gunicorn
在 Docker 容器内运行它:

# Start the application
CMD exec gunicorn --bind :$PORT --workers 1 -k uvicorn.workers.UvicornWorker --threads 8 --timeout 0 main:app

当我启动容器并从我的计算机上的 Postman 访问端点时,任务就会启动,并且在运行时,它们会正常完成。

我现在使用 Google Cloud Run 来托管我的容器。当我调用端点(

XXX.run.app
)时,任务似乎也根据日志启动,但它们似乎停止了,稍后服务将重新启动。

我尝试将请求超时增加到最大值,但这没有帮助。还有什么我可以尝试的吗?

docker google-cloud-platform fastapi gunicorn google-cloud-run
2个回答
2
投票

您的设计并不符合您的期望。您将“实时 API”与 fastAPI 混合在一起,并在后台长时间运行批处理。

2 种行为,2 种服务 -> 关注点分离。

  • 我建议您使用 Cloud Run 作为 FastAPI 后端。
  • 然后为您的批次使用符合批次要求的服务(Cloud Batches、Cloud Run Jobs(但超过 1 小时的超时作业目前仅在私人预览中)、GKE 上的 Pod 作业(是否自动驾驶),...)
  • 要同步2,PubSub和Cloud Functions(或者再次是Cloud Run)是完美的。使用 FastAPI 在 PubSub 中发布消息。使用运行作业流程并确认消息的 Cloud Functions(或 Cloud Run)捕获它。

0
投票

以防万一有人发现自己仍在寻找解决方案。我也有一个 fastapi 设置,尽管我不需要它在 10 小时内保持活动状态,只需 5-10 分钟。

以下配置似乎对我有用: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.