Розетка закрыта, пропущено сердцебиение от клиента из Celery с RabbitMQ - PullRequest
0 голосов
/ 29 декабря 2018

Я создаю сервер приложений Flask, который позволяет на одной конечной точке порождать работника Celery.Через секунду вы можете применить задачу к определенной очереди, связанной с работником.

Все работает нормально, пока работник не используется более 2 минут.Затем RabbitMQ регистрирует сообщение

rabbit_1         | 2018-12-29 15:51:21.573 [error] <0.30372.0> closing AMQP connection <0.30372.0> (172.18.0.1:50058 -> 172.18.0.4:5672):
rabbit_1         | missed heartbeats from client, timeout: 60s

Трассировка стека из приложения

> [2018-12-29 16:51:26,526] ERROR in app: Exception on /sentiment [POST]
> Traceback (most recent call last):   File
> "/home/konrad/anaconda3/lib/python3.6/site-packages/flask/app.py",
> line 1612, in full_dispatch_request
>     rv = self.dispatch_request()   File "/home/konrad/anaconda3/lib/python3.6/site-packages/flask/app.py",
> line 1598, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/flask_restplus/api.py",
> line 325, in wrapper
>     resp = resource(*args, **kwargs)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/flask/views.py",
> line 84, in view
>     return self.dispatch_request(*args, **kwargs)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/flask_restplus/resource.py",
> line 44, in dispatch_request
>     resp = meth(*args, **kwargs)   File "/home/konrad/Documents/ubuntu-docs/python-dev/crypto-ticker-sentiment/sentinet/evaluation_server/routes/sentiment.py",
> line 25, in post
>     prediction = predict_sentiment(queue, text)   File "/home/konrad/Documents/ubuntu-docs/python-dev/crypto-ticker-sentiment/sentinet/evaluation_server/services/evaluation.py",
> line 17, in predict_sentiment
>     task_result = task.get()   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/result.py",
> line 224, in get
>     on_message=on_message,   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/backends/async.py",
> line 188, in wait_for_pending
>     for _ in self._wait_for_pending(result, **kwargs):   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/backends/async.py",
> line 255, in _wait_for_pending
>     on_interval=on_interval):   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/backends/async.py",
> line 56, in drain_events_until
>     yield self.wait_for(p, wait, timeout=1)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/backends/async.py",
> line 65, in wait_for
>     wait(timeout=timeout)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/celery/backends/rpc.py",
> line 63, in drain_events
>     return self._connection.drain_events(timeout=timeout)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/kombu/connection.py",
> line 301, in drain_events
>     return self.transport.drain_events(self.connection, **kwargs)   File
> "/home/konrad/anaconda3/lib/python3.6/site-packages/kombu/transport/pyamqp.py",
> line 103, in drain_events
>     return connection.drain_events(**kwargs)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/amqp/connection.py",
> line 491, in drain_events
>     while not self.blocking_read(timeout):   File "/home/konrad/anaconda3/lib/python3.6/site-packages/amqp/connection.py",
> line 496, in blocking_read
>     frame = self.transport.read_frame()   File "/home/konrad/anaconda3/lib/python3.6/site-packages/amqp/transport.py",
> line 243, in read_frame
>     frame_header = read(7, True)   File "/home/konrad/anaconda3/lib/python3.6/site-packages/amqp/transport.py",
> line 426, in _read
>     raise IOError('Socket closed') OSError: Socket closed

Я думаю, что это может быть что-то с сердцебиением от работника Celery или проблемы с RabbitMQ.Я добавил - без сердцебиения опцию при нересте рабочих, но это не сработало.Поможет ли отключение сердцебиения на RabbitMQ?

Обновление

Я нашел его на странице RabbitMQ doc , но там не сказано, как этого добиться.

Как отключитьHeartbeats Heartbeats можно отключить, установив интервал тайм-аута на 0 как на стороне клиента, так и на стороне сервера.

В качестве альтернативы можно использовать очень высокое (скажем, 1800 секунд) значение на обоих концах для эффективного отключения пульса, поскольку доставка кадра будетбыть слишком редким, чтобы иметь практическое значение.

Ни одна из этих практик не рекомендуется, если только не используются поддерживающие протоколы TCP с достаточно низким периодом обнаружения неактивности

Обновление 2

Iдобавлен heartbeat = 0 в rabbitmq.conf файл, и он все еще не работает.

...