BITERP / PinkRabbitMQ

Внешняя Native API компонента для взаимодействия с RabbitMQ из 1С
MIT License
264 stars 107 forks source link

Компонента зависает, если сервер RabbitMQ временно не отвечает из-за нехватки памяти #6

Closed ripreal closed 4 years ago

ripreal commented 5 years ago

Если у кролика заканчивается оперативная память, то он не разывает существующие соединения, а "завешивает" т.е. ничего по ним не отвечает, а ждет когда у него память освободится. Соответственно от компоненты ожидается, что:

даже если сам севрер кролика повесил соединение, то по таймауту сама компонента его прервет (не важно при отправке или при получении соединение зависло)

image

ripreal commented 5 years ago

Ошибка легко воспроизводится:

  1. Уменьшить порог по памяти на сервере RAbbitMQ https://www.rabbitmq.com/memory.html
  2. Дождаться появление ошибки в логах "Publishers will be blocked.."
  3. Попробовать выполнить методы компоненты basicPublish -> basicConsume - компонента зависнет на втором методе (т.к. отправка сообщения выполняется без подтверждения)

Ошибку невозможно отловить с помощью методов внутри компоненты, в т.ч. через флаги, которые позволяют ожидать подтверждения сообщения AMQP::immediate AMQP::mandatory

ripreal commented 5 years ago

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