Я использую kafka-streams для агрегирования сообщений в KTable. Внутри моей логики агрегации я всегда возвращаю один и тот же аккумулятор, как показано ниже:
streamOfInts
.groupByKey()
.aggregate(Accumulator.empty()) {k,v,acc -> acc}
.toStream()
.to(...)
Я ожидал, что - поскольку значение KTable не изменилось - никакое значение не будет отправлено ниже по потоку. Тем не менее, это не так. Агрегатная функция всегда пересылает обновления.
Что было бы наилучшим способом убедиться, что обновления, которые приводят к одинаковому (или равному) значению, не приводят к переадресации вниз по течению?
1 ответ
По замыслу банкоматов операторы DSL отправляют сообщения «при обновлении», а не «при изменении». Существует билет JIRA, предлагающий добавить семантику «генерировать при изменении» (https: // issues.apache.org/jira/browse/KAFKA-8770).
В качестве обходного пути вы можете реализовать собственный transform()
с хранилищем состояний - для каждой входной записи вы проверяете хранилище, является ли оно новым (-> испускать и помещать в хранилище) или изменилось (-> испустить и обновить хранить). Если он существует и не изменился, ничего не испускать.
Похожие вопросы
Новые вопросы
apache-kafka-streams
Относится к встроенному обработчику потоков Apache Kafka под названием Kafka Streams, который является библиотекой Java для создания приложений обработки распределенных потоков с использованием Apache Kafka.