我正在尝试开发一个应用程序,该应用程序由一个侦听器组成,该侦听器将事件发送到RabbitMQ,Celery从队列中提取该侦听器。
当在本地运行所有组件时,我的应用程序按预期工作。如果我的监听器在本地运行,并且所有其他组件都在Docker容器中运行,那么它也可以工作。但是,如果我也在容器中运行侦听器,那么Celery就不会接收到任何事件。
该应用程序基于Django,与Celery的连接如下所示:
app = Celery('mini_iot')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
在设置中。我有:
CELERY_BROKER_URL = 'amqp://rabbitmq'
其中rabbitmq是容器的主机名。
侦听器使用delay
函数向Celery发送任务。
docker的组成是:
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进行了测试。
我认为您的CELERY_BROKER_URL应该是
amqp://guest:guest@rabbitmq:5672
根据拉比码头文件(https://hub.docker.com/_/rabbitmq/),默认用户名和密码为guest/guest。
您应该添加到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"