rabbitMQ не может заставить пульс работать с php-amqplib

Я наблюдал, как RabbitMQ "застрял" с непрочитанными сообщениями. Очередь показывает потребителя, которого больше нет, и я предполагаю, что RabbitMQ продолжает доставлять сообщения этому потребителю. Они показывают как постоянно увеличивающееся количество непрочитанных сообщений. Я делаю это в PHP с php-amqplib.

Я могу создать проблему, убив потребительский процесс (control-C в командной строке).

Я попытался указать сердцебиение, равное 3 секундам, и оставил в живых оба значения: true и false. С сердцебиением потребитель в конечном итоге потерпит неудачу:

Exception fwrite(): send of 573 bytes failed with errno=32 Broken pipe
PhpAmqpLib\Wire\IO\StreamIO->error_handler(8, 'fwrite(): send ...',
php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php(281): fwrite(Resource id #176, '\x01\x00\x01\x00\x00\x00\x15\x00<\x00(\x00\x00\fb...', 8192)

Проблема № 374 может касаться: https://github.com/php-amqplib/php-amqplib/issues/374

Потребитель потребляет из нескольких очередей, но я считаю, что это не должно иметь значения.

Проблема, которую я пытаюсь решить, заключается в том, что RabbitMQ продолжает думать, что потребитель существует, когда его нет, в результате чего RabbitMQ нигде не доставляет эти сообщения, и они остаются неподтвержденными. Я ищу способ избавиться от этой ложной связи, чтобы эти сообщения могли быть повторно доставлены живому потребителю. Я думаю, что это то, для чего нужно сердцебиение, но я не заставил его работать.

1 ответ

Первая и более важная мысль, которую нам нужно сделать в этом случае, это попытаться "напечатать" ваше контентное сообщение и только вернуть true для потребителя, не обрабатывать ваш реальный код, если вы можете "потреблять" сообщения, проблема в том, что это не так. в кролике, но в нашем процессе, потому что, вероятно, мы тратим много времени на подтверждение сообщения кролику, и Кролик закрывает наши связи.

В моем случае я меняю подход к решению этой проблемы, потому что у меня есть много идентификаторов продуктов для каждого сообщения, и они тратят много времени на обработку ACK, поэтому я приспосабливаю свои сообщения, и после этого он работает хорошо.

Мы можем изменить подходы, такие как создание очередей, чтобы соответствовать этим сообщениям, я не знаю, но это 90% проблем.

Вы можете прочитать больше об Обнаружении Мертвых TCP-соединений с помощью Heartbeats здесь

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