我正在构建一个春季云微服务,该服务使用来自kafka主题的数据。在使用者中,我将主题绑定到KStream。由于kafka的版本低于0.10,因此传入的消息不包含时间戳。当我解析传入的值时,它工作正常。否则,当我按键对它们进行分组时,它不使用“ default.timestamp.extractor”(已设置为org.apache.kafka.streams.processor.WallclockTimestampExtractor)。
此服务我已经使用不同版本的kafka(高于或等于0.10)对其进行了测试,并且效果很好。
这是我的配置:
春天: 云: 流: 卡夫卡: 流: 活页夹: 经纪人:$ {KAFKA_BROKERS} applicationId:电子邮件消息流 组态: default.key.serde:org.apache.kafka.common.serialization.Serdes $ StringSerde default.value.serde:org.apache.kafka.common.serialization.Serdes $ StringSerde commit.interval.ms:1000 default.timestamp.extractor:org.apache.kafka.streams.processor.WallclockTimestampExtractor poll.ms:60000#等待更多消息的阻塞时间 buffered.records.per.partition:2000
我的代码的一部分:
stream
.mapValues(this::mapMessage)
.groupBy(this::buildGroup, Serialized.with(new JsonSerde<>(Group.class), new JsonSerde<>(EmailMessage.class)))
.windowedBy(TimeWindows.of(WINDOW_TIME))
.aggregate(ArrayList::new, this::aggregate, Materialized.with(new JsonSerde<>(Group.class), new MessageListSerialization()))
.toStream()
.process(() -> new MailMessagesProcessor(emailService));
这引发了我这个错误:org.apache.kafka.streams.errors.StreamsException:输入记录ConsumerRecord(topic = .....)使用另一个TimestampExtractor处理此数据。
答案 0 :(得分:0)
Kafka Streams需要经纪人0.10.0或更高版本。它与较早的经纪人不兼容。
Kafka Streams 0.10.0,仅与0.10.0(或更高版本)的代理兼容。
Kafka Streams 0.10.1和更高版本,向后兼容0.10.1(但不兼容较旧的代理),并且兼容较新的代理。
此外,由于Kafka Streams 1.0,要求消息格式为0.10(或更高)。因此,即使将代理升级到0.10.0(或更高版本),如果您的消息格式也没有升级,也将无法使用。
要使用“完全一次”功能,必须使用0.11.0(或更高)的代理版本。
有关更多详细信息,请参见:https://docs.confluent.io/current/streams/upgrade-guide.html#compatibility