gpt4 book ai didi

python - Celery + Flask + Docker,消费者 : Cannot connect to amqp://admin:**@rabbit:5672/myhost: failed to resolve broker hostname

转载 作者:行者123 更新时间:2023-12-04 15:22:28 24 4
gpt4 key购买 nike

背景

我正在构建一个使用 Flask 作为后端框架的 Web 应用程序。该应用程序使用 Celery 将所有耗时任务作为后台任务处理,以免阻塞后端线程。我使用 RabbitMQ 作为 Celery 工作人员的消息代理。我使用 docker-compose 捆绑了每项服务。

问题

应用程序一直运行良好,直到过去几天,突然之间,Celery 工作人员无法连接到消息代理,并显示错误消息 [ERROR/MainProcess] consumer: Cannot connect to amqp://admin:**@rabbit:5672/myhost:无法解析代理主机名。

目录结构和代码

我将文件和目录放在一起作为可重现性最低的示例。

debug/
├── code
│   ├── dev.Dockerfile
│   ├── my_app
│   │   ├── celery_app.py
│   │   ├── config.py
│   │   ├── extensions.py
│   │   ├── __init__.py
│   │   ├── my_tasks.py
│   │   └── test_app.py
│   └── requirements.txt
└── docker-compose_dev.yml

docker-compose_dev.yml

version: "3.7"
services:
rabbit:
image: rabbitmq:3.8.5-management
ports:
- '15673:15672' # in case user has rabbitMQ installed on host
expose:
- "5672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=mypass
- RABBITMQ_DEFAULT_VHOST=myhost

non_working_worker:
build:
context: ./code
dockerfile: dev.Dockerfile
command: "celery worker -A my_app.celery_app:app -l info"
volumes:
- ./code:/code
links:
- rabbit

working_worker:
build:
context: ./code
dockerfile: dev.Dockerfile
command: "celery worker -A my_app.my_tasks:app -l info"
volumes:
- ./code:/code
links:
- rabbit

dev.Docker文件

FROM continuumio/miniconda3

# Make /backend working directory; flask code lives here
WORKDIR /code

# Install from requirements.txt using pip
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
RUN rm requirements.txt

需求.txt

luigi==2.8.11
plotnine==0.7.0
celery==4.4.6
flask==1.1.2
flask-cors
flask-socketio
Flask-Mail
eventlet

测试应用.py

import eventlet
eventlet.monkey_patch()

from flask import Flask
from my_app.extensions import celery

def create_app():
"""
Application factory. Create application here.
"""
app = Flask(__name__)
app.config.from_object("my_app.config")

return app

def init_celery(app=None):
"""
Initialize Celery App
"""
app = app or create_app()
app.config.from_object("my_app.config")

# Set celery worker configuration
# Use this to load config information from flask config file
celery.conf.broker_url = app.config["CELERY_BROKER_URL"]
celery.conf.result_backend = app.config["CELERY_RESULT_BACKEND"]

class ContextTask(celery.Task):
"""Make celery tasks work with Flask app context"""

def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)

celery.Task = ContextTask

return celery

配置.py

# RabbitMQ
CELERY_BROKER_URL='pyamqp://admin:mypass@rabbit/myhost'
CELERY_RESULT_BACKEND='rpc://'

扩展.py

from celery import Celery

celery = Celery()

celery_app.py

from my_app.test_app import init_celery

app = init_celery()

我的任务.py

from celery import Celery


app = Celery()

app.conf.broker_url = 'pyamqp://admin:mypass@rabbit/myhost'
app.conf.result_backend = 'rpc://'

我尝试过的

以下是我尝试过但没有奏效的方法。

  1. RabbitMQ 没有正常启动?
    • 一个。它使用给定的用户名、密码和虚拟主机正确启动。 (可以使用管理插件查看@localhost:15673)
  2. RabbitMQ 在 Celery workers 启动后启动,所以 workers 找不到 broker?
    • 一个。 Celery 具有重试 功能,因此它会不断重试,直到消息代理启动。
  3. 网络问题?
    • 一个。我试过使用/不使用 links 来指定服务名称别名,但仍然没有用。
    • b。请注意,我已经将代理名称指定为 rabbit,如 config.py 文件中指定的那样,而不是 localhost
    • c。我尝试使用 docker-compose 创建的默认网络和自定义网络,但都失败了。
  4. 有趣的是,my_tasks.py 中的 Celery 应用程序实例可以工作(它在 docker-compose 文件中被命名为 working_worker),但 Flask 工厂模式中的 Celery 应用程序实例可以不起作用(它在撰写文件中被命名为 non_working_worker)
    • 一个。同样,它表明 RabbitMQ 工作正常,但 Flask 工厂模式样式的 Celery 应用程序实例化发生了一些奇怪的事情。

过去几天我一直在尝试解决这个问题并在互联网上搜索类似的问题,但没有成功。

我知道这是一篇相当长的文章,但我们将不胜感激任何帮助/建议。

docker-compose 版本

docker-compose version 1.25.3, build d4d1b42b
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019

码头版本

Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:36 2020
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:44:07 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683

最佳答案

我有一个类似的问题,我可以通过在 eventlet 上方的 requirements.txt 中将 dnspython 的版本(eventlets 依赖项之一)指定为 1.16.0 来解决。看起来 eventlet 与最新版本的 dnspython 不兼容,更多信息在这里 https://github.com/eventlet/eventlet/issues/619

关于python - Celery + Flask + Docker,消费者 : Cannot connect to amqp://admin:**@rabbit:5672/myhost: failed to resolve broker hostname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63008308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com