繁体   English   中英

Kafka Streams - 自定义对象的 Serdes

[英]Kafka Streams - Serdes for Custom Objects

我是 Kafka Streams 的新手,发现整个 API 令人困惑,文档也不容易理解。 我正在写一个像这样的简单流应用程序:

  1. 输入流:key(String)->userID,value(String)->一个用户的交易记录JSON字符串。

  2. 拓扑:聚合以上输入并生成一个 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 对象不兼容。

  1. 为什么像 mapValues、groupByKey、聚合这样的操作需要 Serdes?

    我的理解:

    • Streams 库需要使用默认的 serdes 更新内部状态来具体化对象吗?
    • 如果重新分区,key,value需要序列化存储回内部分区做进一步处理吗?
    • 鉴于上述情况,即使我们只是将KTable<String,UserBankBalance>创建为内存中的表示,Serdes 仍然是必需的。

    我已经阅读了官方文档和 API 文档,只是找不到任何好的说明。

  2. 为什么 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 维护AvroSerdeProtobufSerde等,以与从这些工具生成的类一起使用。

得到与 UserBankBalance 对象不兼容的字符串序列化程序

您需要在每个操作中使用GroupedMaterializedConsumedProduced类的某种组合来覆盖默认拓扑 serde。

暂无
暂无

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

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