Установка длительного времени ожидания для сообщения подтверждения RabbitMQ

#rabbitmq #message-queue #bunny

#rabbitmq #очередь сообщений #кролик

Вопрос:

Мне было интересно, возможно ли это. Я хочу извлечь задачу из очереди и выполнить некоторую работу, которая потенциально может занять от 3 секунд или дольше (возможно) минут, прежде чем подтверждение будет отправлено обратно в RabbitMQ с уведомлением о том, что работа завершена. Работа выполняется пользователем, поэтому время, необходимое для обработки задания, варьируется.

Я не хочу подтверждать сообщение сразу после того, как я выйду из очереди, потому что я хочу, чтобы сообщение было отправлено в запрос, если подтверждение не получено. Кто-нибудь может дать мне какое-либо представление о том, как решить мою проблему?

Ответ №1:

Наличие длительного тайм-аута должно быть в порядке, и, конечно, как вы говорите, вы хотите повторной доставки, если что-то пойдет не так, поэтому вы хотите подтвердить только после завершения.

Лучшим способом добиться этого, IMO, было бы иметь несколько потребителей в очереди (т. Е. Несколько потоков / процессов, потребляющих из одной очереди). Это должно быть нормально, если в содержимом вашей очереди нет особых ограничений на порядок (т. Е. Так могло бы быть, если бы очередь содержала содержимое, представляющее данные Postgres, которые включают ограничения FK).

В этом руководстве на веб-сайте RabbitMQ содержится дополнительная информация (ссылка на Python, но должны быть аналогичные руководства для других языков): https://www.rabbitmq.com/tutorials/tutorial-two-python.html

Редактировать в ответ на комментарий от OP:

На какое значение настроено ваше сердцебиение? Если ваш рабочий не подтверждает сердцебиение в течение установленного периода времени, сервер будет считать соединение разорванным.

Не уверен, какой язык вы используете, но для Java вы бы использовали setRequestedHeartbeat метод для указания сердцебиения.

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

Комментарии:

1. Спасибо за совет. Кажется, я не могу найти, где установить эту конфигурацию тайм-аута для сообщения с помощью RabbitMQ. Похоже, что если я не подтвердил сообщение через 10 секунд или около того, RabbitMQ помещает сообщение обратно в очередь для использования другим работником, чего я не хочу. Есть предложения?