RabbitMQ/Celery(Eventlet):服务器意外关闭的连接



大约2-3分钟后,芹菜抛出以下追溯:

File "c:program files (x86)libsite-packageseventlethubsselects.py", line 55, in wait
    listeners.get(fileno, noop).cb(fileno)
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packagesceleryworkerpidbox.py", line 120, in loop
    connection.drain_events(timeout=1.0)
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packageskombuconnection.py", line 315, in drain_events
    return self.transport.drain_events(self.connection, **kwargs)
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packageskombutransportpyamqp.py", line 103, in drain_events
    return connection.drain_events(**kwargs)
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packagesamqpconnection.py", line 500, in drain_events
    while not self.blocking_read(timeout):
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packagesamqpconnection.py", line 505, in blocking_read
    frame = self.transport.read_frame()
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packagesamqptransport.py", line 252, in read_frame
    frame_header = read(7, True)
[2019-06-29 20:38:09,849: WARNING/MainProcess] File "c:program files (x86)libsite-packagesamqptransport.py", line 444, in _read
[2019-06-29 20:38:09,849: WARNING/MainProcess] OSError: Server unexpectedly closed connection
[2019-06-29 20:38:09,849: WARNING/MainProcess] Removing descriptor: 1044

尽管如此,当前任务的工人仍在继续工作。但是在我的Web应用程序中,我继续进行轮询URL,以获取当前任务的更新。在上述错误发生后,与RabbitMQ的连接似乎已关闭,以便该应用程序无法访问结果后端(RabbitMQ(。

我花了很多时间来弄清楚,到底会丢掉这个错误。我得出一个非常模糊的结论,可能是因为工人(目前正在使用:Eventlet,因为在Windows上运行(无法将心跳发送到RabbitMQ。但是我感到非常困惑,因为有些建议将心跳值配置为0(我在下面的配置中可以看到的那样(。另外,这无法解决问题。

这是我当前的配置,这是Github和Stackoverflow上所有最佳建议的绝望混合:

CELERY_BROKER_URL = 'pyamqp://'
CELERY_RESULT_BACKEND = 'amqp://'                           
CELERY_BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}                 
CELERY_BROKER_HEARTBEAT = 0
CELERY_BROKER_POOL_LIMIT = None
CELERY_BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}
CELERY_BROKER_CONNECTION_TIMEOUT = 20
CELERY_BROKER_CONNECTION_RETRY = True
CELERY_BROKER_CONNECTION_MAX_RETRIES = 100
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_IGNORE_RESULT = False
SQLALCHEMY_DATABASE_URI = userpass + basedir + dbname
SQLALCHEMY_TRACK_MODIFICATIONS = False

我希望,兔子和芹菜之间的连接稳定,没有连接错误。

暂时对我来说最大的问题是,我绝对不知道错误触发了什么。是一个工人不向RabbitMQ发送心跳吗?是兔子本身吗?

我为各种提示感到非常高兴。

编辑:忘了提到,我还读到这必须对主机名做点什么。我从芹菜开始:

芹菜-A任务。celeryWorker -loglevel = info-pool = eventlet -without-mingle-without-gossip -without-without heartbeat

它正在Localhost上运行(WebServer正在通过XAMPP运行(。如果我检查RabbitMQ控制台,则不是" Rabbit@localhost",而是" Rabbit@Desktop-XXXX"。也许这导致错误?

从所有芹菜broker设置中删除芹菜前缀。为我工作。

这是我的CeleryConfig.py的片段:

BROKER_HEARTBEAT = 0

BROKER_POOL_LIMIT = None

BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}

BROKER_CONNECTION_TIMEOUT = 30

BROKER_CONNECTION_RETRY = True

BROKER_CONNECTION_MAX_RETRIES = 100

CELERY_RESULT_BACKEND = 'db+sqlite:///portal_tasks.db'

CELERY_TASK_TRACK_STARTED = True

最新更新