Kafka-Steam Branch介绍
通过Kafka Steam的Branch功能,可以实现对数据进行筛选,然后根据数据匹配规则对Steam进行切分。
应用场景
通过Branch功能,我们可以实现一个数据过滤/转发器。
例如该Steam收到了如下业务数据。
9:38:xiaojiu |
1:25:xiaoming |
4:34:xiaosi |
7:75:xiaoqi |
1:25:xiaoming |
1:25:xiaoming |
2:56:xiaoer |
3:23:xiaosan |
数据格式:
用户ID:年龄:姓名
有一个专门对用户ID为1的用户信息特殊处理的业务。例如用户ID为1的VIP用户有一个特定统计PV需求。
为了不影响原业务的处理逻辑和效率,项目里需要对数据源中的数据进行过滤,筛选出来特殊处理。
此时就可以通过定义一个Kafka-Steam的切分规则Predicate,对用户ID为1的数据进行拦截,生成特定的流,发送到另外单独创建的Topic中进行额外处理。
代码:
package com.hyr.kafka.demo.streams.high.dsl.operator;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KStreamBuilder;
import org.apache.kafka.streams.kstream.Predicate;
import java.util.HashMap;
import java.util.Map;
/*******************************************************************************
* @date 2017-12-28 下午 5:28
* @author: <a href=mailto:>黄跃然</a>
* @Description: Branch 将stream按照规则进行切分多个stream。
******************************************************************************/
public class BranchStreams {
public static void main(String[] args) {
Map<String, Object> props = new HashMap<String, Object>();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-stream-processing-application");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.0.133:9092");
// 制定K-V 格式
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass()); // Serdes : Data Types and Serialization
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass()); // Serdes : Data Types and Serialization
StreamsConfig config = new StreamsConfig(props);
KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> kStream = builder.stream("my-input-topic");
// Branch (or split) a KStream based on the supplied predicates into one or more KStream instances.
// 根据规则将Stream进行切分
Predicate<? super String, ? super String> predicate = new Predicate<String, String>() {
@Override
public boolean test(String key, String value) {
switch (value) {
case "a":
return true;
case "b":
return true;
case "c":
return true;
case "d":
return true;
default:
return false;
}
}
};
KStream<String, String>[] kStreams = kStream.branch(predicate);
// TODO 根据规则,切分stream,分发到不通的topic中。
for (KStream stream : kStreams) {
stream.to("my-output-topic"); // stream.to("a"); stream.to("b"); stream.to("c"); stream.to("d");
}
KafkaStreams kafkaStreams = new KafkaStreams(builder, config);
kafkaStreams.start();
}
}
整个KafkaDemo项目代码已提交到Github。