на самом дел вам ничего не мешает обрабатывать сообщения из одной партиции параллельно, при этом порядок и скорость их обработки могут быть произвольными
в кафке мера обработанных сообщений в партиции является оффсетом
оффсет - это просто число, сообщения с id меньше которого являются обработанными, а больше - необработанными
соответственно никто вас не обязывает коммитить оффсет для каждого сообщения
мы, например, храним для каждой партиции оффсеты в min heap и коммитим наибольший посследовательный оффсет из этого хипа после каждого обработанного сообщения
в итоге мы можем параллельно обрабатывать произвольное количество сообщений из партиции, при этом рискуем при падении лишь задублировать обработку тех сообщений, которые уже были обработаны, но не были закомичены
Это я понимаю, я как раз не хочу терять сообщений
Пока два варианта вижу
1. создать побольше партиций и побольше консумеров, и параллелить несколькими консумерами. Просто, но не факт, что эффективно
2. как-то обеспечивать идепмотентность запросов, которые сами по себе технически не идемпотентны сейчас, и читать батчами. Можно добавить таблицу с id запросов, чтобы не обрабатывать один запрос дважды, но одно это идемпотентным запрос не сделает, и если он сфейлился в процессе обработки, то, увы, я об этом уже не смогу сообщить дальше ожидающей стороне. Ну и это сложнее, особенно если учесть, что такое нужно будет провернуть в N сервисов потом