Задать вопрос
@PerseforeComplete

Как в RabbitMQ обрабатывать долгую генерацию LLMкой сообщений?

Упрощённо задача выглядит так
В веб интерфейсе LLMке передаётся запрос, на который она генерирует ответ. Publisher посылает запрос на генерацию. Consumer забирает запрос, запускает LLM для генерации ответа и возвращает ответ.

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

Проблема - RabbitMQ обрывает соединение при очень долгой генерации. Условно - если я передам 3 запроса на генерацию, и LLM на каждый генерирует ответ 20 минут, то для первого ответ сгенерируется и consumer без проблем вернёт ответ, а два других отвалятся с ошибкой, потому что соединение RabbitMQ уже закрыто

[warning] Consumer 1 on channel 1 has timed out waiting for delivery acknowledgement. 
[error] Channel error on connection, channel 1:
[error] operation none caused a channel exception precondition_failed: delivery acknowledgement on channel 1 timed out.


Есть симптоматическое решение - в rabbitmq.conf прописать
consumer_timeout = 1200000 # 2 hours in milliseconds

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

Я не могу увеличивать consumer_timeout вечно. Вопрос в том, как правильно организовать систему что бы был 1 consumer, который из очереди достаёт сообщения и часами их обрабатывает, возвращает в очередь ответ и соединение в очереди при этом не закрывается?
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Wexter
так отправляйте ACK сразу после чтения из очереди и обрабатывайте сколько хотите
Ответ написан
А как у вас идёт работа в этом веб-интерфейсе? Пользователь его часами не закрывает в ожидании ответа?
По-хорошему, тут надо полностью переделать модель взаимодействия - есть персистентная сущность "чат", туда сначала записывается вопрос пользователя, а потом ответ LLM. И тогда Rabbit не блокируется совсем - consumer возвращает ответ не в то же соединение, в котором пришёл запрос, а сохраняет его в БД и, опционально, кидает новое событие в очередь, которое обрабатывает какой-то уже другой consumer, который отправляет пользователю уведомление (ну или можно по websocket и сам ответ LLM прислать, если пользователь окно чата не закрыл).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы