Apache Kafka:检查主题中是否存在消息

时间:2017-05-04 12:23:15

标签: apache-kafka kafka-consumer-api apache-kafka-streams

我有一种情况需要检查主题中是否已存在特定消息,我在主题中绝对不需要重复。

任何人都可以提出任何优雅的方式,而不是消费所有消息并检查它们。

1 个答案:

答案 0 :(得分:0)

我不认为自己是卡夫卡的专家,但我认为你所假装的是“反对”卡夫卡的本质。

然而,我推出了使用Kafka Streams库for Java的解决方案。基本上,该过程如下:

  • 将每封邮件映射到一个新的键值,其中键是上一个键及其值的组合:(key1, message1) -> (key1-message1, message1)

  • 使用键对消息进行分组,因此通过此操作可获得 KGroupedStream

  • 应用reduce函数,将值修改为某个自定义值,例如字符串“Duplicated value”。

  • 将reduce后生成的KTable转换为KStream并将其推送到新的Kafka主题中。

在前面的解释中有很多假设,我将提供一些代码以便给出一些启示:

KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> resources =  builder.stream("topic-where-the-messages-are-sent");

KeyValueMapper<String, String, KeyValue<String,String>> kvMapper = new KeyValueMapper<String, String, KeyValue<String,String>>() {
    public KeyValue<String, String> apply(String key, String value) {
        return new KeyValue<String, String>(key + "-" + value, value);
    }
};

Reducer<String> reducer = new Reducer<String>() {
    public String apply(String value1, String value2) {
        return "Duplicated message";
    }
};

resources.map(kvMapper)
    .groupByKey()
    .reduce(reducer, "test-store-name")
    .toStream()
    .to("unique-message-output");

KafkaStreams streams = new KafkaStreams(builder, props);
streams.start();

请记住,这可能不是最佳解决方案,也许您不会将其视为解决问题的“优雅”方式。

我希望它有所帮助。