[英]Kafka Streams - Serdes for Custom Objects
我是 Kafka Streams 的新手,发现整个 API 令人困惑,文档也不容易理解。 我正在写一个像这样的简单流应用程序:
输入流:key(String)->userID,value(String)->一个用户的交易记录JSON字符串。
拓扑:聚合以上输入并生成一个 KTable<String, UserAccountBalance>。 键是 userId,值是随着聚合的进行而更新的自定义对象。
final KStream<String, String> transactionsInput = streamsBuilder.stream("bank-balance-input-topic"); final KTable<String, UserBankBalance> table = transactionsInput.groupBy((key, value) -> key).aggregate(() -> new UserBankBalance("dummyUserId", 0, "1866-12-23T17:47:37Z"), (userName, transactionRecordStr, userBankBalance) -> { // Code does the following: // 1. Deserialize the transactionRecordStr // 2. Update the UserBankBalance object. // return userBankBalance; });
(默认键、值 serdes 配置为字符串)但是,在运行一些健全性测试时,我得到的字符串序列化程序与 UserBankBalance 对象不兼容。
为什么像 mapValues、groupByKey、聚合这样的操作需要 Serdes?
我的理解:
KTable<String,UserBankBalance>
创建为内存中的表示,Serdes 仍然是必需的。我已经阅读了官方文档和 API 文档,只是找不到任何好的说明。
为什么 Kafka Stream 的库不提供使用 Jackson 的ObjectMapper
ObjectMapperSerdes
就像这个官方示例)? 我想很多用户会有类似的用例,图书馆用户会为此付出重复的努力。
参考:
为什么操作需要 Serdes
Kafka 存储字节。 Streams API 不会将对象从一个操作传递到另一个操作,它使用 Kafka 作为消息总线。 它需要将任何对象序列化为字节以通过网络发送。
如果您使用的是 JSON,那么 Kafka Streams 已经内置了创建 JSONSerde 的方法; 不需要ObjectMapper
一个,因为您可以使用Serdes.serdeFrom
静态方法。 (此外,它会创建对connect-json
模块的依赖并使kafka-streams
类路径膨胀)。
或者,Spring-Kafka 也有JsonSerde
。 Confluent 维护AvroSerde
、 ProtobufSerde
等,以与从这些工具生成的类一起使用。
得到与 UserBankBalance 对象不兼容的字符串序列化程序
您需要在每个操作中使用Grouped
、 Materialized
、 Consumed
或Produced
类的某种组合来覆盖默认拓扑 serde。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.