django-celery 基础设施跨多个服务器,代理是 redis

Aam*_*nan 2 python architecture django celery

目前,我们在单个云服务器上完成了所有设置,其中包括:

  • 数据库服务器
  • 阿帕奇
  • 芹菜
  • redis 充当 celery 和其他一些任务的代理
  • ETC

现在我们正在考虑将主要组件分解为单独的服务器,例如单独的数据库服务器、单独的媒体文件存储、负载均衡器后面的 Web 服务器。原因是不需要购买一台重型服务器,而是使用负载均衡器按需创建服务器,以降低成本并提高整体速度。

我真的对芹菜感到困惑,有没有人曾经在负载均衡器后面的多个生产服务器上使用过芹菜?任何指导将不胜感激。

考虑一个小用例,目前它是在单个服务器上完成的(令人困惑的是,当我们使用多个服务器时如何完成):

  • 用户上传abc.pptx文件->引用存储在数据库中->存储在服务器磁盘上
  • 创建任务(将文档转换为 pdf)并进入 redis(代理)队列
  • 在同一服务器上运行的 celery 从队列中选择任务
    • 读取文件,使用名为的软件将其转换为 pdfdocsplit
    • 在服务器磁盘上创建一个文件夹(稍后将用作静态内容)放置 pdf 文件及其缩略图、纯文本和原始文件

考虑到上述用例,如何设置多个可以执行相同功能的 Web 服务器?

Mal*_*Box 5

Celery 实际上使这变得非常简单,因为您已经将任务放入队列中。随着更多工作人员的变化,每个工作人员都会获取队列中的下一个工作人员 - 因此多个工作人员可以同时处理,每个工作人员都在自己的机器上处理。

此内容分为三个部分,您已经掌握了其中之一。

  1. 共享存储,使所有机器都可以访问相同的文件
  2. 可以将任务分发给多个工作人员的代理 - redis 就适合这种情况
  3. 多台机器上的工人

设置方法如下:

  • 用户将文件上传到前端服务器,前端服务器存储在您的共享存储中(例如S3、Samba、NFS等),并将引用存储在数据库中
  • 前端服务器启动 celery 任务来处理文件,例如

def my_view(request): # ... deal with storing the file file_in_db = store_file(request) my_process_file_task.delay(file_in_db.id) # Use PK of DB record # do rest of view logic...

  • 在每台处理机上运行 celery-worker: python manage.py celery worker --loglevel=INFO -Q default -E

然后,当您添加更多机器时,您将拥有更多工人,并且工作将在他们之间分配。

需要确保的关键事项:

  • 您必须有共享存储,否则这会变得更加复杂
  • 每台工作机器都必须有正确的 Django/Celery 设置才能找到 redis 代理和共享存储(例如 S3 存储桶、密钥等)