通过Kafka Streams DSL中的内部联接获取记录密钥

时间:2019-05-16 15:24:14

标签: apache-kafka apache-kafka-streams

是否可以通过Kafka Stream DSL连接的join部分传入或访问消息密钥?

我现在有这样的东西:

    KStream<String, GenericRecord> completedEventsStream = inputStartKStream.
        join(
            inputEndKStream,
            (leftValue, rightValue) -> customLambda((Record) leftValue, (Record) rightValue),
            JoinWindows.of(windowDuration),
            Joined.with(stringSerde, genericAvroSerde, genericAvroSerde)
        );

但是,传递到leftValue的{​​{1}}和rightValue记录无法访问kafka消息密钥,因为这是一个单独的字符串。他们仅有的内容是消息本身,而不是密钥。

是否有办法从连接lambda内部访问密钥?我可以做的一件事就是简单地将消息密钥添加为消息本身的一部分,并在那里作为常规字段进行访问,但是我想知道框架是否提供了一种直接访问它的方法?

1 个答案:

答案 0 :(得分:2)

在大多数情况下,记录的值中也提供键,这对您的应用而言不是吗?

看起来ValueJoiner接口有一个improvement filed as part of KIP-149,但还没有像KIP中的其他方法那样完成:ValueTransformerValueMapper

您可以在联接之前添加一个步骤来提取密钥,然后在使用ValueMapperWithKey进行联接之前将其包括在消息的值中。