gpt4 book ai didi

java - 为什么将 Avro 与 Kafka 一起使用 - 如何处理 POJO

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:41 28 4
gpt4 key购买 nike

我有一个 spring 应用程序,它是我的 kafka 生产者,我想知道为什么 avro 是最好的选择。我阅读了它及其提供的所有内容,但为什么我不能序列化我自己用 jackson 创建的 POJO 并将其发送到 kafka?

我这么说是因为 avro 生成的 POJO 并不是那么直接。最重要的是,它需要 maven 插件和一个 .avsc 文件。

例如,我在自己创建的 kafka 生产者上有一个名为 User 的 POJO:

public class User {

private long userId;

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public long getUserId() {
return userId;
}

public void setUserId(long userId) {
this.userId = userId;
}

}

我将其序列化并发送到我在 kafka 中的用户主题。然后我有一个消费者本身有一个 POJO 用户并反序列化消息。是空间的问题吗?这样序列化和反序列化不是也更快吗?更不用说维护架构注册表的开销。

最佳答案

您不需要 AVSC,you can use an AVDL file ,它基本上看起来与只有字段的 POJO 相同

@namespace("com.example.mycode.avro")
protocol ExampleProtocol {
record User {
long id;
string name;
}
}

当使用 Maven 插件的 idl-protocol 目标时,将为您创建此 AVSC,而不是您自己编写。

{
"type" : "record",
"name" : "User",
"namespace" : "com.example.mycode.avro",
"fields" : [ {
"name" : "id",
"type" : "long"
}, {
"name" : "name",
"type" : "string"
} ]
}

它还会在您的类路径中放置一个 SpecificData POJO User.java 以便在您的代码中使用。


如果您已有 POJO,则无需使用 AVSC 或 AVDL 文件。有一些库可以转换 POJO。比如你can use Jackson ,这不仅适用于 JSON,例如,您可能只需要为 Kafka 创建一个 JacksonAvroSerializer,或者查找是否存在。

Avro 也有 built-in library based on reflection .

Confluent Schema Registry 序列化程序具有使用基于反射的模型的设置。


那么问题来了 - 为什么选择 Avro(针对 Kafka)?

好吧,拥有架构是一件好事。想想 RDBMS 表,你可以解释这个表,然后你会看到所有的列。转向 NoSQL 文档数据库,它们几乎可以包含任何内容,这就是 Kafka 的 JSON 世界。

假设您的 Kafka 集群中有消费者不知道主题中有什么,他们必须确切地知道主题中产生了谁/什么。他们可以尝试控制台消费者,如果它是像 JSON 这样的明文,那么他们必须找出他们感兴趣的一些字段,然后执行类似 HashMap 的 flaky .get("name") 操作一次又一次,只有在字段不存在时才会遇到 NPE。使用 Avro,您可以清楚地定义默认值和可为空的字段。

您不是必需使用架构注册表,但它为 RDBMS 类比提供了那种类型的explain topic 语义。它还使您无需将模式与每条消息一起发送,以及 Kafka 主题的额外带宽费用。不过,注册表不仅对 Kafka 有用,因为它还可以用于 Spark、Flink、Hive 等围绕流数据摄取的所有数据科学分析。


假设您确实想使用 JSON,那么 try using MsgPack instead并且您可能会看到 Kafka 吞吐量增加并节省代理上的磁盘空间


您还可以使用其他格式,例如 Protobuf 或 Thrift,as Uber has compared

关于java - 为什么将 Avro 与 Kafka 一起使用 - 如何处理 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195813/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com