繁体   English   中英

在Kafka 2中动态路由/复制到多个主题

[英]Dynamic routing/duplicating to multiple topics in Kafka 2

Kafka 2增加了对通过TopicNameExtractor接口进行动态路由的支持,该接口仅支持一个主题值。

也许我要描述的是一个糟糕的设计,但是在这个阶段,我只是好奇卡夫卡流中可能出现的情况。

假设每条消息都带有标签列表,是否可以基于该标签列表将消息复制到多个主题?

目前尚不可能。 但是,已经有功能请求: https : //issues.apache.org/jira/browse/KAFKA-7578

目前,如果记录已重复并发送到多个接收器,则只能将记录写入多个输出主题。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM