如何在 GCP 上部署 RQ / Celery 工作人员?

ris*_*han 9 redis celery flask google-cloud-platform google-cloud-run

我有一个 Flask 应用程序(使用 Dockerfile)部署到 Google Cloud Run。该应用程序的结构与Flask Mega 教程非常相似。它使用在 Cloud SQL 上运行的 Postgres 数据库。

该应用程序需要处理后台任务。看起来CeleryRedis Queue是最常见的方法。我不想使用Cloud Tasks ,因为它违反了12 要素应用程序范式中的开发/产品对等规则。

Redis Queue 在我的本地计算机上启动和运行很简单,但我在任何地方都找不到有关如何将 Redis Queue 与在 Cloud Run 上运行的 Flask 应用程序一起使用的最佳实践指南。

我决定为我的 Redis 实例使用 Google 的 Memorystore,但现在我不确定运行 Redis 工作线程的最佳方式是什么。我希望这些工作人员随着 Flask 服务器将更多任务添加到 Redis 队列而扩展(当发出越来越多的 HTTP 请求时 Cloud Run 扩展实例的方式)。现在,我正在考虑将一个工作程序(带有任务功能的 Flask 应用程序的副本)部署到 App Engine,但这似乎不是一个正确的解决方案。

人们对部署 RQ / celery 工作人员有何建议?我很高兴完全改变我的部署策略(和平台),以实现一个简单的、可扩展的架构,可以在本地开发设置中轻松复制。

小智 1

我已经通过 GCP 上的 Flask 应用程序为 Redis 队列实现了这一点。要实现这一目标,您必须执行以下几个步骤:

  1. 以可以在单个容器中运行多个 CMD 命令的方式更新 docker 文件。一个用于运行 Flask(后端),另一个用于工作进程(如 rqworker /pythonworker.py)。您应该将这两个命令都放在 run.sh 文件中,并在 docker 中指定 chmod 命令以使该文件可执行。然后在 docker 的 CMD 行中放置文件名“CMD ["./run.sh"]”。
  2. 始终允许 GCP 项目设置上的 CPU 分配选项。您可以在云运行中编辑构建或部署选项。默认情况下,当从后端(Flask)发回响应时,CPU 会被释放,并且 Redis 队列操作在后台无法正常工作,主要是当它们需要互联网或需要任何数据库连接时。
  3. 如果无法通过放入requirements.txt文件来使用redis,那么您还可以在docker文件中使用“apt-get install your-worker-package”来指定。