Что делать, если количество партиций ограничено, а сообщения накапливаются и обработка медленнее поступления
Что проверяют
Знаете ли вы, что в брокере с партициями параллелизм группы упирается в их число, и что делать, когда добавить партиции нельзя. Это вопрос про пропускную способность, а не про устройство коммита.
Как отвечать
Сначала измерить, иначе лечение вслепую. Смотреть отставание группы по каждой партиции отдельно, время обработки одного сообщения и куда оно уходит, и распределение по ключу: часто отстаёт одна горячая партиция, а остальные простаивают, и это уже другая задача.
Дальше по слоям.
Ускорить саму обработку. Обычно время уходит не в вычисления, а в запись по одной строке и в синхронные вызовы соседних сервисов. Пакетная запись, переиспользование соединений, увеличенный размер выборки за один опрос дают кратный выигрыш без изменения архитектуры.
Развязать чтение и обработку. Один поток читает, пул потоков обрабатывает. Тогда параллелизм перестаёт упираться в партиции, но появляются обязательства: смещение коммитится только до самого раннего необработанного сообщения, партиция ставится на паузу, пока очередь внутри инстанса полна, а max.poll.interval.ms должен быть больше реального времени обработки, иначе группу выкинет на перебалансировку. Порядок при этом сохраняется, только если раскладывать сообщения по потокам по ключу.
Разгрузить сам поток данных. Быстрый потребитель перекладывает тяжёлое в отдельный топик с большим числом партиций, устаревшие по смыслу сообщения отбрасываются, безнадёжные уходят в очередь недоставленных.
Где спотыкаются
Предлагают поднять ещё инстансов потребителя. Лишние сверх числа партиций не получат ни одной и будут простаивать, и именно это в вопросе названо ограничением.
Добавляют многопоточность и коммитят смещение сразу после чтения. При падении теряется всё, что не успело обработаться, а при перебалансировке соседи получают дубли.
Обещают просто увеличить число партиций, не назвав цену. Уменьшить их обратно нельзя, привязка ключа к партиции меняется, порядок для существующих ключей рвётся, а если узкое место во внешнем сервисе, скорость не вырастет вовсе.