Вы должны понимать, что программа Kafka Streams, то есть ее Topology
my, содержит несколько суб-топологий (https://docs.confluent.io/current/streams/architecture.html#stream -partitions-and-tasks ). Субтопологии связаны друг с другом через темы.
Запись может быть зафиксирована, если она полностью обрабатывается субтопологией. В этом случае промежуточный вывод записи записывается в topi c, который соединяет две суб-топологии до того, как произойдет фиксация. Подтопология нисходящего потока будет считывать данные из «подключения topi c» и фиксировать смещения для этой topi c.
На самом деле фиксация происходит только на основе commit.interval.ms
. Если выборка возвращает, допустим, 100 записей (смещения от 0 до 99), и 30 записей обрабатываются субтопологией при попадании commit.interval.ms
, Kafka Streams сначала проверяет, что вывод этих 30 сообщений сбрасывается в Kafka (ie, Producer.flush()
), а затем будет зафиксировано смещение 30
- остальные 70 сообщений находятся только во внутреннем буфере потоков Kafka и будут обработаны после фиксации. Если буфер пуст, будет отправлена новая выборка. Каждый поток отслеживает commit.interval.ms
независимо и фиксирует все свои задачи, если интервал фиксации пройден.
Поскольку фиксация происходит на основе субтопологии, это может быть чем фиксируется входная запись topi c, в то время как выходной topi c еще не имеет данных результатов, потому что промежуточные результаты еще не обрабатываются подчиненной топологией.
Вы можете проверить структуру своей программы через Topology#describe()
, чтобы увидеть какие суб-топологии есть в вашей программе.