Python中Django集成Celery后如何分布式部署worker?

请教大家:Django 集成了 Celery,怎样分布式部署 worker 啊 👻
Python中Django集成Celery后如何分布式部署worker?

5 回复

配置同一个 broker 共享 broker 就可以了


问题核心: Django集成Celery后,分布式部署worker的本质是让多个独立的worker进程(或容器)连接到同一个消息中间件(如RabbitMQ/Redis),并监听同一个或一组队列。

关键步骤:

  1. 统一消息中间件:所有worker和Django应用必须配置相同的Broker(如CELERY_BROKER_URL='redis://10.0.1.1:6379/0')和结果后端(如果需要)。
  2. 部署多个worker实例
    • 同一服务器:直接启动多个worker进程,指定不同的节点名。
    celery -A proj worker --loglevel=info --hostname=worker1@%h
    celery -A proj worker --loglevel=info --hostname=worker2@%h
    
    • 不同服务器:在每台服务器上安装项目代码、依赖,并运行上述命令。确保它们能访问同一个Broker。
  3. 队列路由(高级):可通过CELERY_TASK_ROUTES将特定任务定向到专用队列,然后让特定worker只消费该队列,实现任务隔离和优先级处理。
    # settings.py
    CELERY_TASK_ROUTES = {
        'app.tasks.cpu_intensive': {'queue': 'high_cpu'},
        'app.tasks.io_heavy': {'queue': 'high_io'},
    }
    
    启动专用worker:
    celery -A proj worker --loglevel=info --queues=high_cpu
    

一句话总结: 配好同一个Broker,在多台机器上跑celery worker命令就行。

,DjangoA 和 DjangoB,都配置成同一个 broker,周期性任务的话,他们可能会各自执行自己的任务,会产生重复的数据,而且好像没达到分配任务给不同 worker 的目的

你到底是有多少个 celery beat 实例?

共用一个 broker 的情况下每个 woker 都是队列的消费者,多处部署仅有一处 worker 能够消费掉消息,不会产生重复的数据

回到顶部