Соединение закрыто в rabbitmq по какой-то причине через некоторое время

Я использую библиотеку pika python для подключения к серверу rabbitmq на локальном хосте.

class BaseRabbitSender(MessageSender):
    __metaclass__ = ABCMeta

    def __init__(self, host):
        self.node = BaseMessagingNode(host)
        self.connection = pika.BlockingConnection(pika.ConnectionParameters(
            host=host))
        self.channel = self.connection.channel()

    @abstractmethod
    def send_message(self, message):
        pass

    def close_connection(self):
        self.connection.close()


class DirectRabbitSender(BaseRabbitSender):
    def __init__(self, host, queue_name):
        super(DirectRabbitSender, self).__init__(host)
        self.queue_name = queue_name
        self.channel.queue_declare(queue=queue_name, durable=True)

    def send_message(self, message):
        self.channel.basic_publish(exchange='',
                                   routing_key=self.queue_name,
                                   body=message,
                                   properties=pika.BasicProperties(
                                       delivery_mode=2,
                                   ))

    def close_connection(self):
        self.connection.close()

По какой-то причине через некоторое время (например, пару дней) я получаю сообщение об ошибке.

 File "build/bdist.linux-x86_64/egg/pika/adapters/blocking_connection.py", line 560, in basic_publish
    (properties, body), False)
  File "build/bdist.linux-x86_64/egg/pika/adapters/blocking_connection.py", line 1147, in _send_method
    self.connection.send_method(self.channel_number, method_frame, content)
  File "build/bdist.linux-x86_64/egg/pika/adapters/blocking_connection.py", line 267, in send_method
    self._send_method(channel_number, method_frame, content)
  File "build/bdist.linux-x86_64/egg/pika/connection.py", line 1504, in _send_method
    self._send_frame(frame.Header(channel_number, length, content[0]))
  File "build/bdist.linux-x86_64/egg/pika/adapters/blocking_connection.py", line 410, in _send_frame
    self.process_data_events()
  File "build/bdist.linux-x86_64/egg/pika/adapters/blocking_connection.py", line 236, in process_data_events
    raise exceptions.ConnectionClosed()
ConnectionClosed

Лог сервера Rabbitmq

=INFO REPORT==== 3-Mar-2014::15:11:03 ===
accepting AMQP connection <0.26625.0> (127.0.0.1:41846 -> 127.0.0.1:5672)

=ERROR REPORT==== 3-Mar-2014::15:38:12 ===
closing AMQP connection <0.326.0> (127.0.0.1:58580 -> 127.0.0.1:5672):
{heartbeat_timeout,running}

=WARNING REPORT==== 3-Mar-2014::16:11:04 ===
closing AMQP connection <0.26625.0> (127.0.0.1:41846 -> 127.0.0.1:5672):
connection_closed_abruptly

=INFO REPORT==== 3-Mar-2014::16:11:05 ===
accepting AMQP connection <0.27016.0> (127.0.0.1:37776 -> 127.0.0.1:5672)

=ERROR REPORT==== 3-Mar-2014::17:41:05 ===
closing AMQP connection <0.27016.0> (127.0.0.1:37776 -> 127.0.0.1:5672):
{heartbeat_timeout,running}

Работает на убунту 13.10. КроликMQ 3.1.3

Я не понимаю, что произошло. Вы можете объяснить?


person user1685095    schedule 05.03.2014    source источник
comment
всегда полезно публиковать информацию о платформе, версиях и т. д.   -  person pinepain    schedule 05.03.2014


Ответы (3)


Соответствующая строка журнала: {heartbeat_timeout,running}.

Что-то мешает BlockingConnection отправлять такты, поэтому RabbitMQ считает вашего клиента недоступным или мертвым. У вас есть 3 варианта:

  • Избегайте блокирующего поведения
  • Увеличить интервал сердцебиения
  • Попробуйте альтернативные реализации подключения, например. Торнадо.
person Michael Klishin    schedule 09.03.2014

Ну, на самом деле проблема заключалась в том, что я остановил rabbitmq-server. И pika не имеет дело с дисконнектами.

person user1685095    schedule 12.03.2014

У меня было несколько тестов, которые я хочу запустить. Все в порядке, когда я запускаю его на своем локальном хосте. Но когда я запускал тесты на сервере, у меня была точно такая же проблема и ситуация, как эта. Я проверил свою pika версию, это 0.9.13. Кстати, я тоже использую BlockingConnection.

Сначала я пытался периодически звонить process_data_events(). Это не сработало.
Во-вторых, я пытался открыть новое соединение и канал всякий раз, когда публикую сообщение или открываю новую очередь. Это не сработало.
В-третьих, я попытался обновить pika до 0.9.14. Это не сработало.

Кто-то в ветке здесь: https://github.com/pika/pika/issues/397 упомянул о возможности ошибки socket. Итак, я проверил версию Python, предположив, что, возможно, есть ошибка, и она была исправлена ​​​​в более поздней версии Python. На сервере версия Python — 2.7.3, а на моем локальном хосте — 2.7.12. Чтобы проверить, действительно ли проблема связана с версией Python, я установил conda и создал среду с версией Python 2.7.3. . Я провел тесты, и они прошли (я не могу воспроизвести проблему).

После всех вышеперечисленных попыток я пришел к еще одной гипотезе, что, возможно, это ошибка в файле rabbitmq-server моего сервера. Я сравнил версии: в локалхосте последняя (3.6.5), в моем сервере 2.8.4. Чтобы убедиться, что это реальная проблема, я провел тесты, но использовал удаленный rabbitmq более поздней версии. Все работало нормально. Итак, я обновил rabbitmq-server и, о чудо, проблема исчезла!

TL;DR:
Решение — обновить rabbitmq-server!

person Teddy Hartanto    schedule 06.11.2016