在介绍Kafka之前,我们先介绍发布与订阅消息系统的概念。
发布与订阅消息系统
数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息的一个特点。发布者以某种方式对消息进行分类,接收者(订阅者)订阅他们,以便接收特定的消息类型。发布与订阅消息一般会有一个broker,也就是发布消息的中心点。
Kafka
毫无疑问,Kafka也是一款基于发布与订阅消息的消息系统。他一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或者数据库提交日志用来提供所有事务的持久记录,通过重放这些日志可以重建系统的状态。同样的,Kafka的数据是按照一定的顺序持久化保存的,可以按需读取。此外,Kafka的数据分布在整个系统里,具备数据故障和性能伸缩能力。
Kafka相关名词
- 消息和批次
- 模式
- 主题和分区
- 生产者和消费者
- broker
消息和批次
Kafka的数据单元被称为消息。消息由字节数据组成。消息还有一个可选的元数据,也就是键。键也是一个字节数组。消息和键
对于Kafka而言,没有特殊的格式和含义。当消息以一种可控的方式写入不同的分区时,会用到键。消息类似关系型数据库中数据表的数据行。
为了提高效率,消息被分批次写入Kafka。批次就是一批消息,这些消息属于同一个主题和分区。如果每一个消息都单独穿行于网路,会导致大量的网络开销,把消息分成批次传输可以减少网络开销。不过,这要在时间延迟和吞吐量上面作出权衡;批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多地计算处理。
模式
对于Kafka而言,消息不过是晦涩难懂的字节数组,需要额外的结构来定义消息内容,让他们更易于理解。所有就有了模式。消息模式可以是XML或者JSON,一种约定的数据格式。生产者和消息者按照双方约定好的格式在消息发送时序列化,在接收消息时进行反序列化。
主题和分区
Kafka消息通过主题进行分类。主题就好比数据库中的数据表,不同的数据表中有不同数据行(消息)。主题可以被分为若干个分区,一个分区就是一个提交日志。消息以追加的方式写入分区,然后以先入后出的顺序读取。要注意,Kafka只能保证消息在单个分区的顺序,不能保证在整个主题范围内的数据。消息被追加在每个分区的尾部(如下图)。Kafka通过分区来实现数据冗余和伸缩性。分区可以分布在不同的服务器上面,也就是说,一个主题可以横跨多个服务器,以此来提高性能和可用性。
生产者和消费者
Kafka的客户端就是Kafka系统的用户,他们被分为两种基本类型:生产者和消息者。
- 生产者:在其他发布与订阅系统中,生产者可能被称为发布者或者写入者。主要职能是创建消息,然后通过消息均衡或者通过key指定分区的方式将消息写入某个分区。
- 消费者:在其他发布与订阅系统中,消费者也可能被称为订阅者或者读者。消费者订阅一个或者多个主题,并按照消息生成的顺序读取他们。消费者通过偏移量来区分读取过的消息。确保不会重复读取消息,Kafka也支持指定偏移量读取之前读取过的消息。
broker和集群
一个独立的Kafka的服务器被称为broker。broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求进行响应,返回已经提交到磁盘上的消息。(直接把磁盘的消息写入网络传输,不经过内存加载)。根据特定的硬件及其性能特征,单个broker可以轻松的处理数千个分区以及每秒百万级的消息量。
broker是集群的组成部分。多个broker组成一个集群,每个集群中都有一个同时充当集群控制器的角色,控制器负责管理工作,包括将分区分配给broker和监控broker。在集群中,一个分区从属于一个broker,该broker被称为分区的首领,一个分区可以分配给多个broker。分区通过主从方式复制消息。实现数据备份。
总结
这篇文章主要介绍了Kafka的一些基本概念和名词解释。之后会在针对各个角色单独进行深入学习。
参考书籍:《Kafka权威指南》