尽管Debeziu开云体育官方注册网址m可以很容易地捕获数据库更改并将其记录在Kafk开云体育电动老虎机a中,但您必须做出的一个更重要的决定是如何这些更改事件将在Kafka中序列化。Kafka中的每条消息都有一个键和一个值,对于Kafka来说,这些是不透明的字节数组。但是当你设置Kafka Connect时,你必须说明Debezium事件键和值应该如何序列化为二进制形式,你的消费者也开云体育官方注册网址必须将它们反序列化为可用的形式。

开云体育官方注册网址Debezium事件键和值都是结构化的,因此JSON当然是一个合理的选择——它灵活、无处不在、与语言无关,但另一方面它相当冗长。一种替代方案是Avro,它同样灵活且与语言无关,但速度更快,结果是较小的二进制表示。使用Avro需要更多的设置工作和一些额外的软件,但它的优势通常是值得的。

Kafka序列化器和反序列化器

在我们深入讨论之前,让我们回顾一下Kafka生产者和消费者通常是如何进行序列化和反序列化的。因为键和值是简单的不透明字节数组,所以可以为键和值使用任何东西。例如,考虑这样一种情况,我们使用简单的整数作为键,字符串作为值。在这里,这些消息的生产者将使用长序列化器要转换二进制格式和a的键字符串序列化器要转换字符串值转换为二进制形式。同时,消费者使用一种长串并转换器将二进制键转换为可用键价值观,以及字符串反序列化器将二进制值转换回字符串对象。

在键和/或值需要更结构化的情况下,生产者和消费者可以使用JSON结构来编写键和/或值,以及kafka提供的JSON序列化器和反序列化器在Kafka消息中进行二进制格式的转换。如前所述,将JSON用于键和/或值是非常灵活且与语言无关的,但它也会产生相对较大的键和值,因为JSON值的字段和结构也需要进行编码。

Avro序列化

Avro数据序列化机制是否使用模式定义数据的结构。Avro在将数据写入二进制格式时依赖于此模式,并且该模式允许它以更紧凑的形式对数据中的字段进行编码。Avro也依赖于模式阅读数据也是如此。但有趣的是,Avro模式是为进化而设计的,因此实际上可以使用与用于写入的模式略有不同的读取模式。这个特性使得Avro成为Kafka序列化和反序列化的绝佳选择。

融合性的提供了一个使用Avro的Kafka序列化器和反序列化器还有一个单独的模式注册表,它的工作方式是这样的:当一个数字或字符串对象要序列化时,Avro序列化器将为给定类型确定相应的Avro模式,向模式注册表注册该模式及其使用的主题,获取模式的唯一标识符,然后以二进制形式编码模式的唯一标识符和编码值。下一条消息可能具有相同的类型和模式,因此序列化器可以快速编码此消息的模式标识符和值,而无需与schema Registry对话。只有当需要序列化一个它还没有看到的模式时,Avro序列化器才会与模式注册表对话。这样不仅速度快,而且还能生成非常紧凑的二进制格式,并允许生产者进化它的键和/或值模式随时间变化。模式注册表还可以配置为只允许注册新版本的模式兼容的使用Avro模式进化规则,确保生产者不会产生消费者无法读取的消息。

与此同时,消费者使用Avro串并转换器,它以类似的方式工作,尽管是反向的:当它读取一个键或值的二进制形式时,它首先查找模式标识符,如果之前没有看到它,则向schema Registry请求模式标识符,然后使用该模式将二进制表示的剩余部分解码为其对象形式。同样,如果反序列化器以前看到过特定的模式标识符,那么它已经拥有解码数据所需的模式,而不必咨询schema Registry。

Kafka连接转换器

Kafka Connect与许多Kafka生产者/消费者有点不同,因为键和值通常是结构化的。Kafka Connect并没有要求连接器使用JSON对象,而是定义了自己的轻量级框架,用于用模式定义数据结构,这使得编写连接器来处理结构化数据变得更加容易。Kafka Connect自己定义转换器类似于Kafka(反)序列化器,除了Kafka Connect的转换器知道这些结构和模式,并可以将键和值序列化为二进制形式。Kafka Connect提供了一个JSON转换器它将结构转换为JSON,然后使用普通的Kafka JSON序列化器,因此下游消费者可以只使用普通的Kafka JSON反序列化器,并获得Kafka Connect结构和模式的JSON表示。这正是开云体育官方注册网址Debezium教程使用,和watch-topic消费者知道如何使用JSON反序列化器。

Kafka Connect的一个伟大特性是连接器简单地提供结构化的消息,Kafka Connect使用配置的转换器负责序列化它们。这意味着你可以使用任何Kafka Connect转换器任何Kafka Connect连接器,包括所有Debezium的连接器。开云体育官方注册网址

Kafka Connect的模式系统是专门为Avro设计的,因此Kafka Connect模式和Avro模式之间是一对一的映射。Confluent提供了Avro转换器对于Kafka Connect,它将连接器提供的Kafka Connect结构序列化为紧凑的Avro二进制表示,再次使用模式注册表,就像Avro序列化器一样。使用者只使用上面提到的普通Avro反序列化器。

使用Avro序列化Debezium事件带来了几个显著的优势:开云体育官方注册网址

  1. Debezium事件的编码二进制形式是开云体育官方注册网址显著小于JSON表示。结构化数据不仅以更紧凑的形式编码,而且模式与此相关联的结构化数据以二进制形式表示为单个整数。

  2. 将Debezium事件编码开云体育官方注册网址为Avro二进制形式非常快。只有当转换器看到一个新的模式时,它才必须咨询schema Registry;否则,模式已经被看到,它的编码逻辑已经被预先计算。

  3. Avro Converter for Kafka Connect生成带有Avro编码的键和值的消息,可以由任何使用Avro反序列化器的Kafka消费者读取。

  4. 开云体育官方注册网址Debezium事件结构基于捕获更改的表的结构。当源表的结构改变时(例如,因为一个改变语句应用于它),事件的结构和模式也将改变。如果这样做的方式使得新的Avro模式为兼容使用旧的Avro模式,那么消费者将能够在不中断的情况下处理事件,即使事件结构随着时间的推移而变化。

  5. Avro的模式机制比自由形式的JSON结构更加正式和严格,并且在比较任意两条消息时可以清楚地识别模式中的更改。

  6. Avro转换器、Avro(反)序列化器和模式注册表都是开源的。

的确,使用Avro转换器和反序列化程序需要运行模式注册表,并且注册表成为流媒体基础设施中不可分割的一部分。然而,为了上面列出的好处,这只是一个很小的代价。

使用Avro转换器与Debezium开云体育官方注册网址

如上所述,为了使Debezium教程尽可能简单,我们避免在教程中使用Schema Registry或A开云体育官方注册网址vro转换器。我们也没有在Docker映像中包含Avro转换器很快就会改变

尽管如此,当你将连接器安装到Confluent平台或你自己的Kafka Connect安装中时,你完全可以将Avro Converter与Debezi开云体育官方注册网址um连接器一起使用。只需配置Kafka连接工人使用Avro转换器的键和值:

key.converter = io.confluent.connect.avro。AvroConverter value.converter=io.confluent.connect.avro.AvroConverter

并且,如果你想使用Avro转换器来处理Kafka Connect内部消息,那么也要设置这些:

internal.key.converter = io.confluent.connect.avro。AvroConverter internal.value.converter=io.confluent.connect.avro.AvroConverter

同样,不需要对Debezium连接器进行任何不同的配置。开云体育官方注册网址

兰德尔Hauch

Randall是Red Hat的一名开源软件开发人员,在数据集成领域工作了近20年。他是Debezium的创始人,并参与了其他开云体育官方注册网址几个开源项目。他住在伊利诺伊州圣路易斯附近的爱德华维尔。


关于Debe开云体育官方注册网址zium

开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源Apache许可证,版本2.0

参与

我们希望您觉得Debezium有趣开云体育官方注册网址且有用,并愿意尝试一下。在Twitter上关注我们@开云体育官方注册网址debezium在Zulip上和我们聊天,或加入我们的邮件列表与社区对话。所有的代码都是开源的GitHub上,因此在本地构建代码并帮助我们改进现有连接器并添加更多连接器。如果您发现了问题或对我们如何改进Debezium有想法,请告诉我们开云体育官方注册网址记录问题

Baidu
map