Тайм-аут ошибки 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); 

Уменьшение количества предварительных выборок потребителем устраняет это исключение тайм-аута.
Количество предварительных выборок по умолчанию не ограничено.

Другие вопросы по тегам