Кафка-потоки: влияние времени хранения памяти на память и производительности - PullRequest
0 голосов
/ 29 июня 2018

У нас есть разработка в kafka-streams, которая производит вид агрегации временного окна:

selectKey().groupByKey().aggregate()

, а затем с помощью

TimeWindows.of().until()

Мой главный вопрос: что произойдет, если until не используется, давайте представим, что у нас есть 1-минутные окна, и по какой-то непредвиденной причине новое событие прибывает с 1 недели назад, сохраняет ли приложение все состояния окон с самого начала ?, не приведет ли это к чрезмерному потреблению памяти или, в случае сохранения состояния всех окон, не будет ли это предполагать значительную задержку для восстановления соответствующего окна?

1 Ответ

0 голосов
/ 29 июня 2018

Мы недавно столкнулись с тем же вопросом. Ответ можно найти в этом исходном файле для потоков кафки:

https://github.com/apache/kafka/blob/1.1/streams/src/main/java/org/apache/kafka/streams/kstream/Windows.java

Который содержит:

static final long DEFAULT_MAINTAIN_DURATION_MS = 24 * 60 * 60 * 1000L; // one day

Таким образом, без указания параметра until(), ваше оконное хранилище состояний будет хранить записи в течение (нижней границы) одного дня по умолчанию.

Другая часть вашего вопроса: что происходит с событиями, которые приходят с опозданием, после того, как истек срок действия окна? Этот ответ есть в руководстве разработчика:

В Kafka Streams DSL пользователи могут указать срок хранения для окно. Это позволяет Kafka Streams сохранять старые оконные блоки для период времени, чтобы дождаться позднего прибытия записей, чьи временные метки попадают в интервал окна. Если запись прибывает после срок хранения прошел, запись не может быть обработана и отброшен.

Объединение этой информации вместе показывает, что если вы не укажете параметр until() в своем оконном потоке, записи будут храниться не менее одного дня, а записи, поступившие с опозданием более чем на один день, будут отброшены.

...