我有一个 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

09-11 19:21
查看更多