Отсутствие событий на ранее пустом разделе при перезапуске приложения kafka streams - PullRequest
0 голосов
/ 31 октября 2019

У меня странная проблема, которую я не могу понять, как я могу решить. У меня есть приложение kafka streams (2.1.0), которое читает тему с 40 разделами. Разделы используют политику разделов диапазона, поэтому в настоящий момент некоторые из них могут быть полностью пустыми.

Моя проблема в том, что во время простоя приложения был активирован один из этих пустых разделов, и в него было записано несколько событий. Когда приложение было восстановлено, оно считало все события из других разделов, но проигнорировало события, уже сохраненные в предыдущем пустом разделе (приложение имеет OffsetResetPolicy LATEST для конкретной темы). Кроме того, когда в конкретный раздел поступали новые сообщения, он их поглощал и каким-то образом обошел предыдущие.

Я предполагаю, что __consumer_offsets не имеет записи для указанного раздела при восстановлении, но как это сделать? Я избегаю этой ситуации, не теряя событий. Я имею в виду, что тема уже существует с указанным количеством разделов.

Звучит ли это кому-нибудь знакомо? Я что-то упустил, мне нужно установить какой-то параметр в kafka, потому что я не могу понять, почему это происходит?

1 Ответ

1 голос
/ 31 октября 2019

Это ожидаемое поведение.

Ваш пустой раздел не имеет смещения в __consumer_offsets. Если для раздела нет зафиксированных смещений, политика смещения, указанная в auto.offset.rest, используется для определения того, с какого смещения начинать использовать события.

Если для auto.offset.reset установлено значение LATEST, ваше приложение Streams начнет потреблять только с самым последним смещением в разделе, т. Е. После событий, которые были добавлены во время простоя, и будет использовать только те события, которые былизаписано в раздел после простоя.

Если для auto.offset.reset установлено значение EARLIEST, ваше приложение Streams запустится с самого раннего смещения в разделе и прочитает также события, записанные в раздел во время простоя.

As @mazaneicaупомянутое в комментарии к вашему вопросу, auto.offset.reset влияет только на разделы без зафиксированного смещения. Таким образом, ваши непустые разделы будут в порядке, т. Е. Приложение Streams будет получать события с того места, где оно остановилось до простоя.

...