Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜+;烧瓶+;Docker,使用者:无法连接到amqp://admin:**@兔子:5672/myhost:解析代理主机名失败_Python_Python 3.x_Flask_Rabbitmq_Celery - Fatal编程技术网

Python 芹菜+;烧瓶+;Docker,使用者:无法连接到amqp://admin:**@兔子:5672/myhost:解析代理主机名失败

Python 芹菜+;烧瓶+;Docker,使用者:无法连接到amqp://admin:**@兔子:5672/myhost:解析代理主机名失败,python,python-3.x,flask,rabbitmq,celery,Python,Python 3.x,Flask,Rabbitmq,Celery,背景 我正在构建一个使用Flask作为后端框架的web应用程序。应用程序使用芹菜将所有耗时的任务作为后台任务处理,以避免阻塞后端线程。我使用RabbitMQ作为芹菜工人的消息代理。我使用docker compose捆绑了每个服务 问题 该应用程序一直运行良好,直到过去几天,突然之间,芹菜工人一直无法连接到message broker,并显示错误消息[error/MainProcess]消费者:无法连接到amqp://admin:**@兔子:5672/myhost:解析代理主机名失败。 目录结构和

背景

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

问题

该应用程序一直运行良好,直到过去几天,突然之间,芹菜工人一直无法连接到message broker,并显示错误消息
[error/MainProcess]消费者:无法连接到amqp://admin:**@兔子: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
开发Dockerfile

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
requirements.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
config.py

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

from celery import Celery

celery = Celery()
芹菜

from my_app.test_app import init_celery

app = init_celery()
my_tasks.py

from celery import Celery


app = Celery()

app.conf.broker_url = 'pyamqp://admin:mypass@rabbit/myhost'
app.conf.result_backend = 'rpc://'
我尝试过的

以下是我尝试过但没有成功的事情

  • RabbitMQ未正确启动?
    • a。它使用给定的用户名、密码和vhost正确启动。(可以使用管理插件@localhost:15673进行检查)
  • RabbitMQ在芹菜工人启动后启动,所以工人找不到代理?
    • a。芹菜具有
      retry
      功能,因此它将继续重试,直到MessageBroker开始运行
  • 网络问题?
    • a。我尝试使用/不使用
      链接来指定服务名称别名,但仍然不起作用
    • b。注意,我已经按照
      config.py
      文件中的指定,将代理名称指定为
      rabbit
      ,而不是
      localhost
    • c。我尝试使用默认网络
      docker compose
      creates和自定义网络,但都失败了
  • 有趣的是,
    my_tasks.py
    中的芹菜应用程序实例可以工作(在docker compose文件中命名为
    working_worker
    ),但Flask factory模式中的芹菜应用程序实例不能工作(在compose文件中命名为
    non_working_worker
    • a。同样,它表明RabbitMQ工作正常,但Flask factory模式风格的芹菜应用程序实例化出现了一些奇怪的情况
  • 在过去的几天里,我试图解决这个问题,并在互联网上搜索类似的问题,但并没有成功

    我知道这是一个相当长的帖子,但任何帮助/建议都将不胜感激

    docker编写版本

    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
    
    docker版本

    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中将eventlet依赖项之一dnspython的版本指定为1.16.0来解决。eventlet似乎与dnspython的最新版本不兼容,这里有更多信息

    首先:对帖子的赞美。结构很好,你很清楚你遇到了什么。我没有时间完全重建您的环境,但我发现docker容器通常很难调试。您可以ssh到flask容器中并检查您是否可以在命令行上使用python来建立连接吗?只是为了检查您是否能够真正到达实例并缩小问题范围。如果不是使用docker compose而是手动运行容器,那么代码是否有效?也许你可以在执行对rmq的调用之前运行一个调试器或打印出语句?哇,真不敢相信这就是问题所在。我花了5天的时间试图调试这个问题。。非常感谢你。dnspython版本更新日志与我的应用程序开始不工作的日期匹配。你是救世主