Kafka-Steam Branch功能 对数据进行切分Steam,发送到指定的Topic

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。

https://github.com/huangyueranbbc/KafkaDemo 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值