本文会介绍:
- Kafka Streams APIs
- Kafka Streams的Hello World例子
- 深入探索基于Kafka Streams的ZMart应用程序
- 把输入流拆分为多个流
1. Streams APIs
Kafka有两类流APIs,low-level Processor API和high-level Streams DSL。本文介绍的是后者DSL,它的核心是KStream对象,表示流式key/value的数据,它的大多数方法都返回KStream对象的引用。
早在2005年,Martin Fowler和Eric Evans开发了fluent interface的概念,也就是接口的返回值和调用时传入的实例是相同的。这种方式对构造多个参数的对象时非常有用,例如:
Person.builder().firstName("Beth").withLastName("Smith").withOccupation("CEO");
在Kafka Streams中,有个重要的区别:返回的KStream对象是一个新的实例,而不是调用方法时的实例。
2. Hello World例子
以下让我们创建一个简单的Hello World例子,把输入的字母转换为大写字母。一般的开发流程是:
- 配置Kafka Streams
- 创建Serde实例
- 创建处理的拓扑
- 创建和启动KStream
2.1 配置Kafka Streams
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "hello-world");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
以上两个属性是必须的,因为它们没有默认值。而且应用的ID在集群内必须是唯一的,服务器地址可以是单个服务器和端口,也可以是由逗号分隔的多个服务器和端口,例如"host1:9092,host2:9092,host3:9092"。
2.2 创建Serde实例
在Kafka Streams中,Serdes类提供了创建Serde实例的简便方法,如下所示:
Serde<String> stringSerde = Serdes.String();
此行代码是使用Serdes类创建序列化/反序列化所需的Serde实例。Serdes类为以下类型提供默认的实现:String、Byte array、Long、Integer和Double。
2.3 创建处理的拓扑
每个流应用程序都实现并执行至少一个拓扑。拓扑(在其它流处理框架中也称为有向无环图DAG,Directed Acyclic Graph)是一系列的操作和转换,每个事件从输入流动到输出。下图是Hello World例子的拓扑图:

下面是相应的处理拓扑代码:
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> simpleFirstStream = builder.stream("src-topic",
Consumed.with(stringSerde, stringSerde));
// 使用KStream.mapValues方法把每行输入转换为大写
KStream<String, String> upperCasedStream = simpleFirstStream.mapValues(line -> line.toUpperCase());
// 把转换结果输出到另一个topic
upperCasedStream.to("out-topic", Produced.with(stringSerde, stringSerde));
2.4 创建和启动KStream
KafkaStreams kafkaStreams = new KafkaStreams(builder.build(), props);
kafkaStreams.start();
3. ZMart应用程序
3.1 主要的需求
- 记录所有客户的消费数据,但要保护敏感信息,例如信用卡号码
- 抽取消费地点的ZIP code,以便分析消费模式
- 抽取客户编号和消费金额,以便计算奖励积分
- 保存所有消费数据,以便日后进行数据分析
3.2 创建Serde实例
因为客户消费的数据是JSON格式,在把数据发送到Kafka时,需要把它序列化为byte数组,这里会使用Google的Gson类:
import java.nio.charset.Charset;
import java.util.Map;
import org.apache.kafka.common.serialization.Serializer;
import com.google.gson.Gson;
public class JsonSerializer<T> implements Serializer<T> {
private Gson gson = new Gson();

本文详细介绍了Kafka Streams的使用,包括KStream对象、Hello World示例、ZMart应用程序的开发,以及如何进行交互式开发和应对新增需求。文中涉及配置Kafka Streams、创建Serde实例、构建处理拓扑以及过滤和拆分数据流等操作。
最低0.47元/天 解锁文章
7850

被折叠的 条评论
为什么被折叠?



