你能在Django的不同容器中运行Celery吗



从我今天的阅读中,在我发现的所有例子中,我都没有看到芹菜在一个与Django本身完全独立的容器中。Celery似乎有在同一个容器中,因为它遍历应用程序源文件并查找tasks.py以及初始的Celery.py。这是正确的还是我今天误读了?

例如。我熟悉使用dockercompose来旋转Django、Nginx、Postgres和存储容器。我假设我将添加一个celery和rabbitmq容器,但我看不出如何将Django配置为使用远程celery服务器。

我对芹菜的了解还很早,我希望这不是我在其他地方忽视的。

谢谢,
-p

默认情况下,如果您使用Heroku,它会为django运行一个web Dyno来响应请求,为Celery运行另一个工作程序Dyno,每个Dyno都在一个单独的实例上运行。

两个Dynos都运行相同的代码,您的芹菜工作人员需要访问模型,并且管理/部署一个代码库很容易,但没有什么可以阻止您为每个实例使用不同的代码库,因为Django和celery之间的通信是用AMQP协议完成的,抛出一个类似Reddis的Broker。

在单个容器中运行所有进程更简单。但是,您可以在一个单独的容器中运行每个进程。他们将通过代理和结果后端相互通信。

下面是我的示例存储库,它使用Django、Celery、RabbitMQ和Redis。此外,Django还提供REST API(用于DRF的wsgi服务器)和WebSockets(用于Django Channels的asgi服务器)。每个进程都在单独的容器中运行,但它们有共同的代码库(都存储在单个存储库中)。

version: '2'
services:
    nginx:
        restart: always
        image: nginx:1.12-alpine
        ports:
            - 8000:8000
        volumes:
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
            - static_volume:/app/backend/server/django_static
    client:
        build:
            context: .
            dockerfile: ./docker/client/Dockerfile
        restart: always
        ports:
            - 5001:5000
        expose:
            - 5000
    postgres:
        restart: always
        image: postgres:9.5.6-alpine
        volumes:
          - ./docker/postgres/data:/var/lib/postgresql
        ports:
            - 5433:5432
        expose:
            - 5432
        environment:
            FILLA_DB_USER: tasks_user
            FILLA_DB_PASSWORD: tasks_password
            FILLA_DB_DATABASE: simple_tasks
            POSTGRES_USER: postgres
        volumes:
            - ./docker/postgres/init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh
    redis:
        image: redis:3.0-alpine
        restart: unless-stopped
        ports:
            - 6378:6379
    rabbitmq:
        image: rabbitmq:3.7-alpine
        restart: unless-stopped
    wsgiserver:
        extends:
            file: docker-common.yml
            service: backend
        entrypoint: /app/docker/backend/wsgi-entrypoint.sh
        volumes:
            - static_volume:/app/backend/server/django_static
        links:
            - postgres
            - redis
            - rabbitmq
        expose:
            - 8000
    asgiserver:
        extends:
            file: docker-common.yml
            service: backend
        entrypoint: /app/docker/backend/asgi-entrypoint.sh
        links:
            - postgres
            - redis
            - rabbitmq
        expose:
            - 9000
    worker:
        extends:
            file: docker-common.yml
            service: backend
        entrypoint: /app/docker/backend/worker-entrypoint.sh
        links:
            - postgres
            - redis
            - rabbitmq
    redislistener:
        extends:
            file: docker-common.yml
            service: backend
        entrypoint: /app/docker/backend/redis-listener-entrypoint.sh
        links:
            - postgres
            - redis
            - rabbitmq
    workerlistener:
        extends:
            file: docker-common.yml
            service: backend
        entrypoint: /app/docker/backend/worker-listener-entrypoint.sh
        links:
            - postgres
            - redis
            - rabbitmq
volumes:
    static_volume: {}

对于小型项目,我会将所有流程保留在一个容器中,而对于需要扩展的大型项目,我则会使用多个容器。

相关内容

  • 没有找到相关文章

最新更新