Упрощённо задача выглядит так
В веб интерфейсе 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, который из очереди достаёт сообщения и часами их обрабатывает, возвращает в очередь ответ и соединение в очереди при этом не закрывается?