RabbitMQ: Pika Connections сбрасывается из-за ошибки пира - PullRequest
1 голос
/ 05 июля 2019

Сообщения, которые я получаю в очереди, большие, и функция обратного вызова занимает 40-50 секунд, чтобы завершить обработку каждого сообщения. У меня есть следующая часть кода в функции обратного вызова:

if ch.is_open:
    print "channel is open: ", ch.is_open
    print "Method delivery tag: ", method.delivery_tag
else:
    print "Channel is closed"

ch.basic_ack(delivery_tag = method.delivery_tag)

Я всегда получу распечатку из заявления if, как показано ниже:

Channel is open: True
Method delivery tag: x #Some number

Но я получаю следующую ошибку после операторов печати,

  File "receive_vb.py", line 200, in <module>
    channel.start_consuming()
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 1822, in start_consuming
    self.connection.process_data_events(time_limit=None)
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 758, in process_data_events
    self._dispatch_channel_events()
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 521, in _dispatch_channel_events
    impl_channel._get_cookie()._dispatch_events()
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 1445, in _dispatch_events
    evt.body)
  File "receive_vb.py", line 180, in callback
    ch.basic_ack(delivery_tag = method.delivery_tag)
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 2031, in basic_ack
    self._flush_output()
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 1292, in _flush_output
    *waiters)
  File "/usr/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 477, in _flush_output
    result.reason_text)
pika.exceptions.ConnectionClosed: (-1, "error(104, 'Connection reset by peer')")

Для самого первого сообщения. Поэтому я попытался запустить без basic_ack, сообщение обрабатывается и случайно попадает в сообщение об ошибке в разных сообщениях. 2-е сообщение, 474-е сообщение, 181-е сообщение и т. Д.

Я попытался установить heartbeat_interval = 0 и некоторые большие числа, такие как, heartbeat_interval =150 Ничего не получилось. Как мне решить эту проблему. Заранее спасибо

Ниже приведен журнал RabbitMQ

=INFO REPORT==== 5-Jul-2019::03:58:56 ===
accepting AMQP connection <0.17625.50> (10.168.37.108:45318 -> 10.168.37.108:5672)

=INFO REPORT==== 5-Jul-2019::03:58:56 ===
connection <0.17625.50> (10.168.37.108:45318 -> 10.168.37.108:5672): user 'guest' authenticated and granted access to vhost '/'

=ERROR REPORT==== 5-Jul-2019::03:59:26 ===
closing AMQP connection <0.17625.50> (10.168.37.108:45318 -> 10.168.37.108:5672):
{writer,send_failed,{error,timeout}}

1 Ответ

0 голосов
/ 08 июля 2019

Ваши сообщения слишком большие для отправки по сети до истечения времени записи TCP в RabbitMQ:

{writer,send_failed,{error,timeout}}

Вам необходимо сжать свои сообщения, чтобы сделатьих меньше, или разбить их на несколько сообщений.Ваша сеть может быть перегружена или ваш сервер перегружен.Или могут быть другие проблемы с сетью или сервером, препятствующие быстрой доставке сообщений - здесь недостаточно информации для ее диагностики.

В качестве крайней меры вы можете увеличить время ожидания записи сокета для RabbitMQ с помощью tcp_listen_options.send_timeout но это только прикрыло бы симптом настоящей первопричины.

...