我有一个 Spring 应用程序,是我的kafka制作人,我想知道为什么avro是最好的选择。
我阅读了有关它的内容以及它提供的所有内容,但是为什么我不能仅序列化我用 jackson 创建的POJO并将其发送给kafka?
我之所以这样说,是因为avro产生的POJO并不那么直接。
最重要的是,它需要Maven插件和.avsc文件。
因此,例如,我在我的kafka生产者上创建了一个名为JOO的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。例如,您不仅需要JSON的can use Jackson,还可能需要为Kafka创建一个
JacksonAvroSerializer
,或者查找是否存在。Avro还具有built-in library based on reflection。
那么问题来了-为什么选择Avro(对于Kafka)?
好的,拥有一个架构是一件好事。考虑一下RDBMS表,您可以解释该表,然后看到所有列。移至NoSQL文档数据库,它们实际上可以包含任何内容,这就是Kafka的JSON世界。
假设您在Kafka集群中有一些消费者,他们不知道主题中的内容,他们必须确切地知道主题中产生了谁/产生了什么。他们可以尝试使用控制台使用者,如果它是像JSON这样的纯文本格式,那么他们必须找出他们感兴趣的某些字段,然后一次又一次地执行类似HashMap的
.get("name")
这类不稳定的操作,只有当一个字段进入NPE时,不存在。使用Avro,您可以清楚地定义默认值和可为空的字段。您不需要使用架构注册表,但是它为RDBMS类比提供了这种类型的
explain topic
语义。这也使您无需将架构与每条消息一起发送,并且省去了Kafka主题上额外带宽的开销。该注册表不仅对Kafka有用,因为它可用于Spark,Flink,Hive等,用于围绕流数据提取的所有数据科学分析。假设您确实想使用JSON,然后使用try using MsgPack instead,您很可能会发现Kafka吞吐量有所增加,并节省了代理上的磁盘空间
您还可以使用其他格式,例如Protobuf或Thrift,as Uber has compared