网站首页 > 知识剖析 正文
上一节提到了消息对于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,但是消息被发送到哪了呢?在内存或硬盘上是怎么组织和存储的呢?
- 生产者要把消息发送到一个地方,然后消费者知道去某个地方消费某种类型的消息。
- 存储消息的地方如何限制大小
- 如何控制消息在这个地方存放的时间
- 把消息存储在一个地方,这个地方只有一个门,如果大量的消费蜂蛹而至都来取消息,怎么保证吞量?
- 发送的消息是否是顺序的呢
- 消息只存储在一个地方如果丢了怎么办
假如你设计一个消息系统,如何解决以上问题呢?
猜你喜欢
- 2024-11-23 Spring中源码中涉及的「设计模式」知多少?
- 2024-11-23 spring阅读--容器及实例化
- 2024-11-23 Java教程:学会写Starter-你就懂了SpringBoot自动配置
- 2024-11-23 SpringBoot学习笔记三之表述层
- 2024-11-23 如何使用Java API操作HDFS系统?
- 2024-11-23 Spring IOC容器XML配置示例
- 2024-11-23 xml 配置文件规范 校验
- 2024-11-23 阿里P7大神,Java学习之路-IO流与XML,超赞分享
- 2024-11-23 Java基础教程:dubbo源码解析-服务暴露与发现
- 2024-11-23 解决springboot的pom.xml文件第一行报错问题
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)