领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

Kafka基本概念——Schema

nixiaole 2024-11-23 20:30:48 知识剖析 14 ℃

上一节提到了消息对于kafka来说就是一个黑盒子,或者说kafka根本不关心消息内容。那么我们有什么好的方法来描述这个黑盒子的消息内容呢?

对于一些简单的系统,我们可以使用JSON (JavaScript Object Notation)或XML (Extensible Markup Language),因为它们是易读的,且有成熟的框架来解析这些类型的消息。但是JSON和XML会有以下问题

  1. JSON和XML数据缺少一个Schema
  2. 无法定义数据的类型
  3. 无法定义哪些字段是必填的,以及无法定义是否可为null
  4. 当生产者JSON或XML数据格式发生变化时(例如增加或减少字段),会影响到所有的消费者,奇妙消费者同时配合修改。

有什么办法来解决以上问题呢,答案就是为数据定义一个Schema,生产者发送消息以及消费者消费消息时,都需要根据事先预定义的Schema来处理消息。

生产者需要先从Schema仓库获取当产最新版本的Schema,然后根据Schema来生成消息并对消息进行压缩和序列化,然后发送。

消息费者收到消息后,怎么知道用哪个版本中Schema来解析数据呢?原来生产都组装消息时,会将所用的Schema在Schema仓库中的ID写入到消息中。这样消费者可以根据消息中存储的Schema ID去Schema仓库中获取当前消息所使用的Schema,然后解析消息。


Schema的版本控制

在实际的使用中,消息的格式可能会经常变化,例如增加或删除字段、更改某字段的类型、修改某字段是否为空的属性等。但在有些场景中,我们需要允许多个版本Schema的消息同时存在。这就要求新版本的Schema需要对老版本的Schema进行兼容。

当前最常有的Schema定义和消息压缩序列化框架是Apache Avro, 官网https://avro.apache.org/

前面我们介绍了消息和描述消息的Schemal,但是消息被发送到哪了呢?在内存或硬盘上是怎么组织和存储的呢?

  1. 生产者要把消息发送到一个地方,然后消费者知道去某个地方消费某种类型的消息。
  2. 存储消息的地方如何限制大小
  3. 如何控制消息在这个地方存放的时间
  4. 把消息存储在一个地方,这个地方只有一个门,如果大量的消费蜂蛹而至都来取消息,怎么保证吞量?
  5. 发送的消息是否是顺序的呢
  6. 消息只存储在一个地方如果丢了怎么办

假如你设计一个消息系统,如何解决以上问题呢?

Tags:

最近发表
标签列表