Kafka 2增加了对通过TopicNameExtractor接口进行动态路由的支持,该接口仅支持一个主题值。
也许我要描述的是一个不好的设计,但是在这个阶段,我只是好奇Kafka流中的可能。
假设每条消息都带有标签列表,是否有一种方法可以基于该标签列表将消息复制到多个主题?
答案 0 :(得分:1)
目前尚不可能。但是,已经有功能请求:https://issues.apache.org/jira/browse/KAFKA-7578
目前,如果记录已重复并发送到多个接收器,则只能将记录写入多个输出主题。
答案 1 :(得分:0)
Matthias如何提到您必须复制邮件。可以使用KStream::flatMapValues(ValueMapperWithKey ...)
示例代码如下。邮件将根据tags: List<String>
复制。
型号:
public class Person {
public String name;
public List<String> tags;
public transient String mainTag;
public Person(String name, List<String> tags) {
this.name = name;
this.tags = tags;
}
public Person(String name, List<String> tags, String mainTag) {
this.name = name;
this.tags = tags;
this.mainTag = mainTag;
}
}
应用程序:
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "app1");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, PersonSerdes.class);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
StreamsBuilder builder = new StreamsBuilder();
KStream<String, Person> input = builder.stream("input");
input.flatMapValues(((readOnlyKey, person) ->
person.tags
.stream()
.map(tag -> new Person(person.name, person.tags, tag))
.collect(Collectors.toList()))
).to((key, person, recordContext) -> person.mainTag);