我正在尝试开发一个由侦听器组成的应用程序,该侦听器会将事件发送到RabbitMQ,Celery从队列中提取事件。
在本地运行所有组件时,我的应用程序按预期工作。如果我的侦听器在本地运行,并且所有其他组件都在Docker容器中运行,那么它也可以工作。但是,如果我也在容器中运行侦听器,那么Celery将不会收到任何事件。
该应用程序基于Django,并且与Celery的连接是这样完成的:
app = Celery('mini_iot')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
在settings.py中,我有:
CELERY_BROKER_URL = 'amqp://rabbitmq'
其中Rabbitmq是容器的主机名。
侦听器使用delay
函数将任务发送给Celery。
docker-compose是:
version: '3'
services:
listener:
image: core-app
command: python manage.py runscript listener
volumes:
- .:/mini-iot
depends_on:
- rabbitmq
- mqtt
working_dir: /mini-iot/mini_iot
worker:
image: core-app
command: celery -A mini_iot worker --loglevel=info -f log2.txt
volumes:
- .:/mini-iot
depends_on:
- rabbitmq
- mqtt
working_dir: /mini-iot/mini_iot
rabbitmq:
image: rabbitmq:3.6.10
volumes:
- /var/lib/rabbitmq:/var/lib/rabbitmq
ports:
- "5672:5672"
- "15672:15672"
有人可以帮助我调试问题吗,或者有人对问题是什么有想法吗?
容器可以在正确的端口上相互通信。我已经使用telnet进行了测试。
答案 0 :(得分:0)
您应将links分别添加到listener
和worker
中:
version: '3'
services:
listener:
image: core-app
command: python manage.py runscript listener
volumes:
- .:/mini-iot
links:
- rabbitmq
depends_on:
- rabbitmq
- mqtt
working_dir: /mini-iot/mini_iot
worker:
image: core-app
command: celery -A mini_iot worker --loglevel=info -f log2.txt
volumes:
- .:/mini-iot
links:
- rabbitmq
depends_on:
- rabbitmq
- mqtt
working_dir: /mini-iot/mini_iot
rabbitmq:
image: rabbitmq:3.6.10
volumes:
- /var/lib/rabbitmq:/var/lib/rabbitmq
ports:
- "5672:5672"
- "15672:15672"
答案 1 :(得分:0)
我认为您的CELERY_BROKER_URL应该是
amqp://guest:guest@rabbitmq:5672
根据rabbitmq docker文档(https://hub.docker.com/_/rabbitmq/),默认用户名和密码为guest / guest。