Ну взяли вы пачку в 10 сообщений. На обработку одного уходит 5мс. Закомитили офсет через 1мс. Через 3 упали. Сообщения потеряли. Дальше я любой ваш кейс сведу к этому сценарию до тех пор, пока вы не начнете читать сообщения строго последовательно из партиции и делать коммит офсета по одному сообщению.
Значит, вы коммитите оффсет не так, как надо в данном сценарии.
Есть в общем два сценария:
- нужен большой throughput, потеря какого-то числа сообщений - некритична. Тогда имеет смысл коммитить оффсет асинхронно и "иногда".
- нужны гарантии обработки, тогда как правило одновременно нужна и последовательность. Коммитить оффсет синхронно после успешной обработки сообщения.
Что делать во втором случае, если какое-то сообщение невозможно обработать по какой-то причине? Зависит от юз-кейса. Иногда - фиксить консюмер, чтобы он смог его обработать. Иногда - складывать в DLQ. Иногда - игнорировать и идти дальше.