我有一种情况需要检查主题中是否已存在特定消息,我在主题中绝对不需要重复。
任何人都可以提出任何优雅的方式,而不是消费所有消息并检查它们。
答案 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();
请记住,这可能不是最佳解决方案,也许您不会将其视为解决问题的“优雅”方式。
我希望它有所帮助。