Во-первых, вам необходимо отделить (если только сначала) чтение сообщений от обработки этих сообщений.Далее рассмотрим, сколько одновременных вызовов вы можете сделать с вашим API, поскольку нет смысла вызывать его чаще, чем сервер может обработать, асинхронно или нет.Если количество одновременных вызовов API примерно равно количеству разделов в вашей теме, то нет смысла вызывать API асинхронно.
Если число разделов значительно меньше максимального числа возможных одновременных вызовов API, у вас есть несколько вариантов.Вы можете попытаться сделать максимальное количество одновременных вызовов API с меньшим количеством потоков (по одному на каждого потребителя), вызвав асинхронный вызов API, как вы предлагаете, или вы можете создать больше потоков и выполнять ваши вызовы синхронно.Конечно, тогда вы столкнетесь с проблемой того, как ваши потребители могут передавать свою работу большему количеству общих потоков, но это именно то, что потоковые платформы исполнения, такие как Flink или Storm, делают для вас.Потоковые платформы (такие как Flink), которые предлагают обработку контрольных точек, также могут решить проблему обработки коммитов со смещением, когда сообщения обрабатываются не по порядку.Вы можете свернуть свою собственную обработку контрольных точек и свою собственную систему управления общими потоками, но вам действительно нужно избегать использования платформы потокового исполнения.
Наконец, у вас может быть больше потребителей, чем максимально возможных одновременных вызовов API, но тогда я бы посоветовал вам просто иметь меньше потребителей и разделять разделы, а не потоки вызовов API.
И, изКонечно, вы всегда можете изменить количество тематических разделов, чтобы сделать предпочитаемый вами вариант выше более подходящим.
В любом случае, чтобы ответить на ваш конкретный вопрос, вы хотите посмотреть, как Flink выполняет обработку контрольных точек с фиксацией смещения Kafka.Чтобы упростить (потому что я не думаю, что вы хотите бросить свой собственный), потребители kafka должны помнить не только смещения, которые они только что зафиксировали, но они должны держаться за предыдущие смещения, зафиксированные, и это определяет блок сообщений.течет хоть ваше приложение.Либо этот блок сообщений полностью обрабатывается полностью, либо необходимо откатить состояние обработки каждого потока до точки, где было обработано последнее сообщение в предыдущем блоке.Опять же, это значительное упрощение, но так оно и есть.