Я использую kafka-streams для агрегирования сообщений в KTable. Внутри моей логики агрегации я всегда возвращаю один и тот же аккумулятор, как показано ниже:

  streamOfInts
    .groupByKey()
    .aggregate(Accumulator.empty()) {k,v,acc -> acc}
    .toStream()
    .to(...)

Я ожидал, что - поскольку значение KTable не изменилось - никакое значение не будет отправлено ниже по потоку. Тем не менее, это не так. Агрегатная функция всегда пересылает обновления.

Что было бы наилучшим способом убедиться, что обновления, которые приводят к одинаковому (или равному) значению, не приводят к переадресации вниз по течению?

0
Jan Bols 17 Окт 2019 в 22:20

1 ответ

Лучший ответ

По замыслу банкоматов операторы DSL отправляют сообщения «при обновлении», а не «при изменении». Существует билет JIRA, предлагающий добавить семантику «генерировать при изменении» (https: // issues.apache.org/jira/browse/KAFKA-8770).

В качестве обходного пути вы можете реализовать собственный transform() с хранилищем состояний - для каждой входной записи вы проверяете хранилище, является ли оно новым (-> испускать и помещать в хранилище) или изменилось (-> испустить и обновить хранить). Если он существует и не изменился, ничего не испускать.

0
Matthias J. Sax 20 Окт 2019 в 06:00