schema(schema定义)奔走相告
对于一些简单的系统,我们可以使用JSON 或XML ,因为它们是易读的,且有成熟的框架来解析这些类型的消息。
上一节提到了消息对于kafka来说就是一个黑盒子,或者说kafka根本不关心消息内容那么我们有什么好的方法来描述这个黑盒子的消息内容呢?对于一些简单的系统,我们可以使用JSON (JavaScript Object Notation)或XML (Extensible Markup Language),因为它们是易读的,且有成熟的框架来解析这些类型的消息。
但是JSON和XML会有以下问题JSON和XML数据缺少一个Schema无法定义数据的类型无法定义哪些字段是必填的,以及无法定义是否可为null当生产者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,但是消息被发送到哪了呢?在内存或硬盘上是怎么组织和存储的呢?
生产者要把消息发送到一个地方,然后消费者知道去某个地方消费某种类型的消息存储消息的地方如何限制大小如何控制消息在这个地方存放的时间把消息存储在一个地方,这个地方只有一个门,如果大量的消费蜂蛹而至都来取消息,怎么保证吞量?。
发送的消息是否是顺序的呢消息只存储在一个地方如果丢了怎么办假如你设计一个消息系统,如何解决以上问题呢?
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186