Тайм-аут ошибки RabbitMQ
Я настроил RabbitMQ, чтобы анализировать около 20000 запросов от внешнего API, но время ожидания истекает через несколько минут. Это дает возможность правильно проанализировать около 2000 из 20000 запросов.
Файл журнала говорит:
=INFO REPORT==== 16-Feb-2016::17:02:50 ===
accepting AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672)
=ERROR REPORT==== 16-Feb-2016::17:03:21 ===
closing AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672):
{writer,send_failed,{error,timeout}}
Я уже увеличил значение сердцебиения, но не могу понять, почему оно истекло. Конфигурация: Ubuntu 14.04, NGINX 1.8.1, RabbitMQ 3.6.0
Буду признателен за ваше время и вклад!
2 ответа
Я только что решил похожую проблему в Python. В моем случае это было решено путем уменьшения числа предварительных выборок для потребителя, чтобы в его буфере приема было меньше сообщений в очереди.
Моя теория состоит в том, что приемный буфер потребителя заполняется, а затем RMQ пытается записать какое-то другое сообщение в сокет потребителя и не может из-за переполнения сокета потребителя. RMQ блокирует на этом сокете, и в конечном счете таймауты и просто закрывает соединение на потребителе. Наличие меньшей очереди предварительной выборки означает, что приемный буфер сокета не заполняется, и RMQ может записывать любые сообщения бухгалтерского учета, которые он пытался выполнить, и поэтому не прерывает время записи и не закрывает соединение.
Это всего лишь теория, но, похоже, это подтверждается моими испытаниями.
В Python установить счетчик предварительной выборки можно следующим образом:
subChannel.basicQos(10);
(Спасибо @shawn-guo за напоминание добавить этот фрагмент кода)
Добавьте больше к ответу @tul.
subChannel.basicQos(10);
Уменьшение количества предварительных выборок потребителем устраняет это исключение тайм-аута.
Количество предварительных выборок по умолчанию не ограничено.