当前位置: 首页 > 知识库问答 >
问题:

为什么使用Avro和Kafka-如何处理POJO

亢雅懿
2023-03-14

我这么说是因为来自avro的POJO一代不是那么直截了当的。在此基础上,它需要maven插件和一个.avsc文件。

例如,我在我的Kafka制作人上创建了一个POJO,名为User:

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用户,并反序列化消息。是空间问题吗?这样序列化和反序列化不是也更快吗?更不用说维护模式注册表的开销了。

共有1个答案

鲁建茗
2023-03-14

您不需要AVSC,您可以使用AVDL文件,它基本上看起来与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"
  } ]
}

它还将在类路径上放置specificDataPOJOuser.java以便在代码中使用。

Avro还内置了基于反射的库。

那么对于这个问题--为什么是阿夫罗(为Kafaka)?

嗯,有一个模式是件好事。想一想RDBMS表,您可以解释该表,并看到所有列。转移到NoSQL文档数据库,它们可以包含任何内容,这就是Kafka的JSON世界。

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

您不需要使用模式注册表,但它为RDBMS类比提供了explainTopic类型的语义。它还使您不必将模式与每条消息一起发送,并省去了在Kafka主题上的额外带宽开销。注册表不仅对Kafka有用,因为它可以用于Spark、Flink、Hive等所有围绕流数据摄取的数据科学分析。

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

你也可以使用其他格式,比如Protobuf或Thrift,正如Uber所比较的

 类似资料:
  • 使用avro的Kafka模式管理为我们提供了向后兼容性的灵活性,但我们如何处理方案中的突破性更改? 假设生产者A向消费者C发布消息M 假设消息M的方案发生了重大变化(例如名称字段现在被拆分为名字和姓氏),我们有了新方案M-new 现在我们正在部署producer A-New和Consumer C-New 问题是,在我们的部署过程完成之前,我们可以让生产者发布一条新消息M-new,消费者C(旧的那个

  • 我正试图编写一个应用程序,将与Kafka集成使用骆驼。(版本-3.4.2) 我从这个问题的答案中借用了一种方法。 我有一条路线可以监听Kafka主题的信息。通过使用一个简单的执行器,该消息的处理与消耗是分离的。每个处理都作为任务提交给该执行者。消息的顺序并不重要,唯一需要考虑的因素是消息处理的速度和效率。我已禁用自动提交,并在任务提交给执行者后手动提交消息。丢失当前正在处理的消息(由于崩溃/关闭)

  • 我的目标是从HTTP源获取JSON数据并使用AVRO序列化将其存储在Kafka主题中。 使用Kafka Connect和一个HTTP源连接器以及一堆SMT,我成功地创建了一个连接数据结构,当使用StringConverter写入主题时,它是这样的: 结构{base=stations,cod=200,coord=Struct{lat=54.0,lon=9.0},dt=163210605} 因此,JS

  • 为什么要用元图保存一个标签列表,而不是只给它一个名字(即只给它附加一个唯一的标签)?为什么我要向给定的元图添加多个标记?如果我试图通过某个标记从加载一个元图形,但该中的多个元图形与该标记匹配,该怎么办? 文档认为,建议使用将整个模型(而不是仅变量)保存在自包含的文件中。但是还将图形和变量保存在文件中。那么使用有什么好处呢?文件上说 当您想要保存和加载变量、图和图的元数据时--基本上,当您想要保存或

  • 本文向大家介绍Kafka的流处理是什么意思?相关面试题,主要包含被问及Kafka的流处理是什么意思?时的应答技巧和注意事项,需要的朋友参考一下 答:连续、实时、并发和以逐记录方式处理数据的类型,我们称之为Kafka流处理。

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的