消息
Kafka 的数据单元称为消息,Kafka 中的消息可以理解成关系数据库的一条记录。消息由字节数组组成 ,Kafka不关心消息数据里面的内容,对Kafka来说没有特殊的格式和含义。
消息有一个可选的元数据,也就是键(key)
,键与消息数据一样也是字段数组,同样对于 Kafka 来说没有特殊的含义。键与可以像关系数据库的主键一样,用来标记某一条消息,也可做一些其他用处如当需要以一种可控的方式将消息写入不同的分区 时,需要用到键。
简单的例子就是为键生成一个一致性哈希值,然后用哈希值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是会被写到相同的分区中。
消息模式
由于消息是字节数组,Kafka 并不知道具体的含义,在实际开发和使用过程我们会定义一种消息模式来序列化和把序列化消息。不同的应用程序有不同的需求,一些简单的模式如:JSON、XML 都是使用非常广泛的。
数据格式的一致性对Kafka来说非常重要它消除了消息读写操作之间的耦合性,想像一下生产者与消费者使用不同的消息格式,肯定就会乱套了。
主题和分区
Kafka 的消息通过主题进行分类。主题就好比关系数据表或者文件系统的文件夹。主题又可以分为若干个分区,一个分区就是一个提交日志。消息会以追加的方式被写入分区,然后按照先入先出的顺序读取。
由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内是有序的。
生产者和消费者
Kafka 的客户端就是Kafka系统的用户,其被分为两种基本类型:生产者和消息者,顾名思义生产者是用来生产消息的,消息者是用来消息和处理消息的。
生产者创建消息,一条消息会被发布到一个特定的主题上。在默认情况下,生产者会把消息均衡的分页到主题的所有分区中,不过,在某些情况下,生产者会把消息直接写入到指定的分区,这通常是通过消息键和消息分区器来实现的。
消费者读取消息,消费者会订阅一个或者多个主题,并按照消息顺序读取它们。消费者通过检查消息的偏移量来区分已经读取过的消息。
偏移量(不断递增的整数值) 是另一种元数据,在创建消息时,Kafka会把它添加到消息里。在给定的分区中,每一条的消息偏移量是的,越往后消息的偏移量就越大(但不一定是严格单调递增)。消费者会把每一个分区可能的下一个偏移量保存起来(通常保存在Kafka中),如果消费者关闭或者重启,则其读取状态不会丢失。
多个消费者可以组成一个消费者群组,属于同一群组的一个或多消费者共同读取一个主题。群组可以保证每个分区只被这个群组里的一个消费者读取。
Broker和集群
一台单独的Kafka服务器被称为broker。broker主要负责:收入生产者消息、持久化消息、为消费者提供消费服务。根据硬件配置及其性能特征的不同,单个broker可以轻松处理数千个分区和每秒百万级的消息量。
broker组成了集群,每个集群都有一个同时充当了集群控制器角色的broker,这个broker被称为leader。leader负责分配分区 和监控broker。在集群中,一个分区从属于一个broker,这个broker被称为分区首领。一个被被分配给其他broker的分区副本叫作这个分区的跟随者。
总结
太久没写技术文章了,有点生疏,如有错误欢迎指正。近也是刚开始学习Kafka的知识,做一些记录,加深印像。
原文链接:https://mp.weixin.qq.com/s/bWEgD7xcnpER1t5S9CyLsg