为什么将 Avro 与 Kafka 结合使用 - 如何处理 POJO

2024-01-29

我有一个 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,您可以使用 AVDL 文件 https://avro.apache.org/docs/1.8.1/idl.html,它基本上看起来与只有字段的 POJO 相同

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

其中,当使用idl-protocolMaven 插件的目标是为您创建这个 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杰克逊 https://github.com/FasterXML/jackson-dataformats-binary/tree/master/avro#generating-avro-schema-from-pojo-definition,这不仅适用于 JSON,您可能只需要创建一个JacksonAvroSerializer例如,对于 Kafka,或者查找是否存在。

阿芙罗还有基于反射的内置库 https://blog.jeffli.me/blog/2014/04/05/avro-cookbook-part-ii/#parse-schema-from-existing-java-class/.

Confluence SchemaRegistry 序列化器有一个使用基于反射的模型的设置。


所以对于这个问题——为什么选择 Avro(卡夫卡)?

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

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

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


假设您确实想使用 JSON,那么尝试使用 MsgPack 代替 https://msgpack.org/您可能会看到 Kafka 吞吐量有所增加,并节省了代理上的磁盘空间


您还可以使用其他格式,例如 Protobuf 或 Thrift,正如 Uber 所比较的那样 https://eng.uber.com/trip-data-squeeze/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将 Avro 与 Kafka 结合使用 - 如何处理 POJO 的相关文章

随机推荐

  • 如何强制 Swift 可选数组(很好)

    使用斯威夫特 2 1 我正在寻找一种好方法将非可选类型数组分配给可选类型数组 其中类型相同 以下是我尝试过的一些方法 var foos Int let bars Int foos bars Error Cannot assign value
  • 红宝石中的“$:”是什么?

    通常可以在 gemspec 文件中看到 例如 i18n gemspec https github com svenfuchs i18n blob master i18n gemspec lt lt File expand path lib
  • 硒等待两个元素之一出现

    很多时候我希望网络驱动程序等待两个元素之一的存在 通常 当我期望页面在某些情况下显示元素 1 或元素 2 时 就会发生这种情况 目前 我正在使用两次等待顺序执行此操作 但效率很低 因为我需要等待 2 次 有什么办法可以将两种等待合二为一吗
  • 使用 LINQ 将数据插入到使用序列作为主键生成器的表中

    我有一个表 它根据序列生成主键 从 0 开始计数 CREATE TABLE dbo testTable id int NOT NULL a int NOT NULL CONSTRAINT PK testTable PRIMARY KEY C
  • 如何将 Z3 与 C++ 结合使用

    我想将 Z3 与 C 一起使用 并且我遵循了安装指南 使用 Visual Studio 命令提示符在 Windows 上构建 Z3 https github com Z3Prover z3 building z3 on windows us
  • Webmatrix 布局——插入头部?

    我使用 Asp Net 和 Razor 视图引擎创建了一个网站 与使用 WebMatrix 相同 到目前为止 我一直在使用 SQL 直接查询数据库 但现在我有一个页面需要查询返回 XML 的 WCF 服务 让它返回 JSON 或 ODATA
  • 在 SQLAlchemy 中使用 declarative_base 时,如何根据需要绑定引擎?

    这是我的代码 from sqlalchemy import create engine Column Integer from sqlalchemy ext declarative import declarative base from
  • 如何在 postgresql 中找到列中的最大值?

    例如 name weight jon 100 jane 120 joe 130 如何只返回权重最大的人的名字 SELECT name FROM tbl ORDER BY weight DESC LIMIT 1 比其他答案性能更高 并且仅产生
  • 2013 年我应该使用 HTML5 编写我的网站吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 验证日期模式

    我需要一个 javascript 方法来验证日期模式 如下所示 2012 年 1 月 14 日 到目前为止 我不确定该模式使用哪个正则表达式 因为它不是标准日期 例如 14 01 2012 或 01 14 2012 或 01 04 2012
  • 为什么 jqueryUI datepicker 会抛出错误?

    我正在尝试 jqueryUI 但 firebug 在该脚本上捕获以下错误 function date datepicker 萤火虫错误如下 date datepicker is not a function 在我的 html 上 日期 id
  • 启发式和元启发式有什么区别?

    经过对算法的一些研究后 我发现了两个令我困惑的术语 我读过至少 20 篇论文 但都没有任何明确的定义 我希望有人能帮助我区分启发式算法和元启发式算法之间的区别 如果可能的话 添加它的来源 ps 我已经知道这些词的含义 但我不知道它们在计算机
  • 如何将旋转器数据从一个活动传递到另一个活动?

    此代码不会从微调器读取值 它始终只读取第一个值 btnResult setOnClickListener new View OnClickListener final String USN spnConversions getSelecte
  • 在 Visual Studio 中设置 FILE_ATTRIBUTE_DEVICE

    我想知道是否可以在 Visual C 中调用 CreateFile 函数来创建属性为 FILE ATTRIBUTE DEVICE 0x00000040 十六进制 64 十进制 的文件 根据 MSDN API FILE ATTRIBUTE D
  • Laravel 4 - 使用 hasMany 关系时插入多条记录

    仍在适应 Laravel 4 我有点不确定为什么这不起作用 在 L3 中 我能够将多条记录插入到表中 如下所示 comments array array message gt A new comment array message gt A
  • 依赖项规范必须是字符串或映射

    pubspec yaml 第 32 行第 5 列出错 依赖项规范必须是字符串或映射 32 assets 33 酒吧失败 65 问题是我的资产文件夹位于错误的位置 它不应该处于依赖关系下 另外 assets 前必须加2个空格 如图
  • Swift 中的属性和变量有什​​么区别?

    从一些最初的教程中 我看到属性属于一个类 本质上是 C 世界中使用的 全局变量 几年前编码 我还认为变量更多的是仅在方法中使用 存储信息的 本地 实体 然后我看到了 Quora 的这个帖子 https www quora com Apple
  • Java win32 库/api

    是否有合适的 Java win32 库 例如 显示当前进程 查找进程占用的端口号等 或者像 WMI 库之类的东西 看一下JNA https github com twall jna 这是与本机代码通信的 100 纯 java 方式 他们有一
  • 如何抑制 Delphi DataSnap 错误消息对话框?

    我们在 Windows 2003 Server 上运行 DataSnap Delphi 2009 应用程序 DataSnap 客户端和服务器位于同一台计算机上 通过 Borland Socketserver 使用 DCOM 客户端运行后台批
  • 为什么将 Avro 与 Kafka 结合使用 - 如何处理 POJO

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