Сбой приложения после слишком большого количества пропущенных сердцебиений

У меня есть приложение, которое распределяет нагрузку на группу рабочих. Пока что все рабочие процессы работают на одной и той же виртуальной машине, масштабирование пока не требуется. Моя проблема в том, что, как и каждые 3-4 дня, рабочий вылетает с сообщением об ошибке ниже - нет контакта между клиентом и сервером rabbitmq за 1200 секунд (я думаю).

Traceback (most recent call last):
  File "/var/www/vhosts/niklas/workers/builder.py", line 170, in <module>
    BuildWorker().main()
  File "/var/www/vhosts/niklas/lib/worker.py", line 29, in main
    self.msgs.ch.start_consuming()
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 722, in start_consuming
    self.connection.process_data_events()
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 93, in process_data_events
    self.process_timeouts()
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 99, in process_timeouts
    self._call_timeout_method(self._timeouts.pop(timeout_id))
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 164, in _call_timeout_method
    timeout_value['method']()
  File "/usr/local/lib/python2.6/dist-packages/pika/heartbeat.py", line 85, in send_and_check
    return self._close_connection()
  File "/usr/local/lib/python2.6/dist-packages/pika/heartbeat.py", line 106, in _close_connection
    HeartbeatChecker._STALE_CONNECTION % duration)
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 75, in close
    self.process_data_events()
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 91, in process_data_events
    self._handle_timeout()
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 198, in _handle_timeout
    self._on_connection_closed(None, True)
  File "/usr/local/lib/python2.6/dist-packages/pika/adapters/blocking_connection.py", line 235, in _on_connection_closed
    raise exceptions.AMQPConnectionError(*self.closing)
pika.exceptions.AMQPConnectionError: (320, 'Too Many Missed Heartbeats, No reply in 1200 seconds')

Мой вопрос в том, что может быть причиной этого? Это происходит только с ~ 1 из трех рабочих процессов, остальные работают нормально, без каких-либо сообщений об ошибках или предупреждений (опять же, все рабочие процессы и rabbitmq-сервер на одной виртуальной машине). Я использую стандартный метод в библиотеке Python pika, start_using(), для получения новых запросов. Код здесь слишком большой, и, учитывая сообщение об ошибке, похоже, что это не мой код или системная проблема.

Я использую:

  • Питон Пика 0.9.8
  • RabbitMQ 3.0.0
  • Дебиан 6.0
  • Все рабочие запускаются внутри экрана
  • ВМ размещена на Linode, память 512 МБ

person Niklas9    schedule 11.12.2012    source источник


Ответы (1)


Мы столкнулись с похожей проблемой из-за ошибки (#236) в pika 0.9.8.

https://github.com/pika/pika/pull/236

Это должно быть исправлено в 0.9.9 или может быть решено путем исправления вашей библиотеки pika с исходным кодом, прикрепленным к связанной проблеме на github.

(Пика закрывал соединение при 2 кумулятивных пропущенных сердечных сокращениях, а не при 2 последовательных).

person Mark Pullan    schedule 09.01.2013