kafka那些重要的概念,消息与消息批次、主题与分区、模式、生产者和消费者、偏移量、broker与集群、日志片段、消息保留
消息和消息批次
kafka是一个帮助应用之间在网络间传递信息的一个组件,网络间双方通讯的信息称之为:消息。如果了解过网络,就会知道在网络之间的双方通讯,其本质传输的信息为字节数组。kafka帮助传递消息,如果消息量巨大,那么消息将以批次的方式进行传递,一个批次就是一组消息,分组传递消息将会减少网络开销,但也会增加消息的处理延迟,毕竟一组消息的消费比一条消息肯定要慢一点,可以通过将一组消息进行压缩处理,减少延迟,但是也增加了计算开销。
主题与分区
在数据库中,我们将一类事物的数据集中在一起,称之为表,在kafka中,同一类消息可以通过定义主题来集中在一起,更细粒度的,可以将主题划分为多个分区,分区就是一个提交日志,消息以追加的方式写入分区,分区的消息是先入先出的顺序进行处理,由于一个主题包括多个分区,所有无法保证主题内的消息的顺序,但是可以保证某个分区内的消息的执行顺序,在kafka中,可以定义消息的键(或称为key),通过一个一致性散列函数,将同一个散列结果的消息存入同一分区。分区可以存于不同的服务器,所以一个主题可以横跨多个服务器。
模式
kafka的消息是字节数组,对人不友好,因为不易理解。所以需要有一个易于理解且简洁的消息结构,这种消息结构称之为模式。模式可以使用JSON、XML来定义,它们使用广泛且简洁,但是它们不同版本之间的兼容性不够好,且缺乏强类型处理能力,kafka开发者喜欢使用Apache Avro,它提供了一种紧凑的序列化格式,模式和消息体是分开的,当模式发生变化时,不需要重新生成代码,它还支持强类型和模式进化,其版本既向前兼容,也向后兼容。定义良好的模式,保持数据格式的一致性非常重要,它消除了消息读写之间的耦合性。
生产者和消费者
对于任何一个基于发布订阅的消息系统来说,生产者与消费者都是其中不可或缺的角色,生产者和消费者都是kafka的客户端,是kafka系统的用户。生产者与消费者你可以理解为两个类,比如生产者为KafkaProducer,消费者为KafkaConsumer,通过使用和扩展两个类的功能来实现消息的发布与订阅,kafka系统在此过程中作为一个统筹者,进行消息传递,保存着配置的元数据,记录消息的消费位置,并提供消息持久化、消息压缩等工作。
生产者生产消息,一般情况下,一个消息会被发布到一个特定的主题上,生产者在默认情况下把消息均衡地分布在主题的所有分区上。而并不关心特定消息会被写到哪个分区。特定情况下,生产者会把消息写到指定的分区,通过消息的键和分区器来实现的,比如前面提到的一致性散列函数。生产者也可以自定义分区器。
消费者消费消息。消费者可以订阅一个或多个主题。消费者是消费者群组的一部分,也就是说会存在一个或多个消费者共同订阅一个主题,群组能保证每个分区只能被一个消费者使用,通过此种成组的方式,消费者可以消费包含大量消息的主题,因为是多个消费者合作消费,而且此种情况还有好处在于,如果某个消费者失效了,其它消费者可以接替它的工作继续消费。
偏移量
偏移量是一种元数据,它本质是一个不断递增的整数值,在生产者创建消息时,kafka(或者说broker)会将它加入到消息结构中,在给定的分区里,每个消息的偏移量是唯一的。消费者把每个分区最后读取的消息的偏移量保存在Zookeeper或kafka中。可以把偏移量当做是每个分区下的消息的唯一定位标识,就跟数组里面的下标索引一样,消费者将最后读取消息的偏移量进行保存,也是保证意外发生并恢复后能保证消息还是以正确的顺序进行消费。
broker和集群
一个独立的kafka服务器被称为broker(代理、中间人),broker是kafka系统的大脑,它接收生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘的消息,一般来说,单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
集群:就是kafka服务构建的集群,所以broker是其组成部分之一,每个kafka集群都有一个broker同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来),控制器负责管理工作,包括将分区分配给broker和监控broker,在集群中,一个分区从属于一个broker,该broker称之为分区的首领(t1)。一个分区可以分配给多个broker,这个时候会发生分区复制,分区复制提供了消息冗余,如果有一个broker失效,其它broker可以接管领导权(t2)。不过,相关的生产者和消费者都要重新连接到新的首领。初次理解t1和t2两段话,可能会觉得冲突,不要将分区复制后的两个分区当做是同一个分区,所以就算发生了分区复制,所得到的两个分区p1与p2,都是独立的分区,所以这两个独立的分区都是从属于一个broker(他们各自的,比如broker1与broker2),他们的首领不同。p1的首领为broker1,p2的首领为broker2。
日志片段
消息持久化到磁盘被称为日志写入,持久化的消息称为日志片段,可以指定存放这些日志片段的目录,还可设置这些日志片段的保留策略。日志片段的过期时间取决于日志片段的关闭时间与配置的过期时间之和,比如一个日志片段需要10天才能关闭(写入最后一个消息后就不再写入了),然后再根据配置的过期时间为7天,所以总的时间为17天。
消息保留
消息保留(一定期限内)是kafka的一个重要特性。kafka默认的消息保留策略是:要么保留一段时间(比如7天),要么保留一定大小的字节数(比如1GB),当消息数量达到这些上限时,旧消息就会过期并被删除,所以在任何时刻,可用消息的总量都不会超过配置参数所指定的大小,主题可以配置自己的保留策略,可以将消息保留到不再使用他们为止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具