RabbitMQ / Celery (eventlet): сервер неожиданно закрыл соединение - PullRequest
1 голос
/ 29 июня 2019

примерно через 2-3 минуты сельдерей выбрасывает следующую трассировку:

File "c:\program files (x86)\lib\site-packages\eventlet\hubs\selects.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)\lib\site-packages\celery\worker\pidbox.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)\lib\site-packages\kombu\connection.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)\lib\site-packages\kombu\transport\pyamqp.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)\lib\site-packages\amqp\connection.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)\lib\site-packages\amqp\connection.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)\lib\site-packages\amqp\transport.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)\lib\site-packages\amqp\transport.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

Тем не менее, работник текущей задачи продолжает свою работу. Но в моем веб-приложении я постоянно опрашиваю URL, чтобы получать обновления текущей задачи. После того, как вышеупомянутая ошибка происходит, соединение с RabbitMQ кажется закрытым, так что приложение больше не может получить доступ к бэкенду результата (также RabbitMQ).

Я потратил много времени на выяснение того, что именно может вызвать эту ошибку. Я пришел к очень расплывчатому выводу, что это может быть связано с тем, что работник (в данный момент использующий: eventlet, потому что работает в Windows) не может отправлять тактовые импульсы в RabbitMQ. Но я запутался, потому что некоторые советуют настроить значение Heartbeat на 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 и Celery стабильно и не возникает ошибка соединения.

Самая большая проблема для меня на данный момент в том, что я абсолютно не знаю, что именно вызывает ошибка. Это работник не посылает сердцебиение в RabbitMQ? Это сам RabbitMQ?

Я очень рад за любой намек.

EDIT : Забыл упомянуть, что я также читал, что это связано с именем хоста. Я начинаю сельдерей с:

сельдерей -A task.celery работник --loglevel = информация --pool = eventlet - без смешивания - без сплетни - без сердцебиения

и он работает на локальном хосте (веб-сервер работает через XAMPP). Если я проверяю консоль RabbitMQ, то это не "rabbit @ localhost", а "rabbit @ DESKTOP-xxxx". Может быть, это приводит к ошибке?

...