Kafka介绍
Kafka是什么?
kafka是一种分布式的,基于发布/订阅的消息系统。
Kafka的特点
分布式,吞吐量高,发布订阅模式,轻量灵活,较长时间持久化
Kafka的应用场景
解耦
- 原先一个微服务是通过接口(HTTP)调用另一个微服务,这时候耦合很严重,只要接口发生变化就会导致系统不可用。
- 使用消息队列可以将系统进行解耦合,现在第一个微服务可以将消息放入到消息
异步
电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。
比较常见的:发送短信验证码、发送邮件
削峰
- 因为消息队列是低延迟、高可靠、高吞吐的,而且消息队列不需要处理业务
,所以消息队列可以应对大量并发,
日志处理
可以使用消息队列作为临时存储,或者一种通信管道
消息队列通信的模式
点对点模式
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
发布订阅模式
多个消费者可以消费一个消息
每个消息可以有多个订阅者,消息队列收到的消息,每个订阅这个主题的消费者都可以消费
发布订阅模式还有消费组的形式,多个消费者组成一个消费组,一个消费组里只有一个消费者能消费这条信息。
两种消费模式
推模式
在推模式下,由消息队列主动把消息推送给消费者消费。
拉模式
由消费者监控现队列的状态,主动拉取消息消费。
Kafka架构中关键概念
Broker
Kafka是以集群的形式运行的,集群的节点就叫broker,每个broker都有对应的编号
Topic
主题是一个逻辑概念,用于生产者发布数据,消费者拉取数据,生产者将数据发送到Kafka的topic上,订阅了这个topic的消费者就能消费到这些数据。
Producer
生产者,负责将数据推送给broker的topic
Consumer
消费者,负责从broker的topic中拉取数据,并自己进行处理
Partition
在Kafka集群中,topic被分为多个分区。这些分区会分布在不同的broker节点上。
Replica
每个分区由多个副本构成,副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。
- 每个分区都是由多个副本组成,每个分区有多个副本。
- 多个副本中,有一个是leader副本,而其他的都是follower副本。
- leader副本负责Kafka的读写,follower副本负责与leader副本的数据同步。副本可以确保某个服务器出现故障时,确保数据依然可用。
- kafka的副本数量不能大于broker节点数量
- Kafka的副本会均匀分配在所有的broker节点上,不会出现一个分区的两个副本出现在同一个broker节点
Consumer Group
一个消费者组可以包含多个消费者,组内的消费者根据消费策略,一起消费主题的所有分区数据.
offset偏移量
在Kafka中,每个主题都被分成多个分区,每个分区都是一个有序的消息队列。每条消息在分区中都有一个唯一的偏移量(offset),它表示了这条消息在分区中的位置。消费者在消费消息时,会记录它当前消费到的位置,也就是offset。这样,如果消费者停止或失败,它可以根据记录的offset继续从上次离开的地方开始消费。offsets可以存储在Kafka或ZooKeeper中,以便在消费者重新启动或故障转移时进行恢复。
消费者的offsets存储在一个名为__consumer_offsets的内部Kafka主题中。
主题,分区,副本,日志段之间的关系
一个主题分为多个分区,每个分区由多个副本组成,每个分区的多个副本分为leader和follower,leader负责数据的读写,follower负责和leader数据进行同步。分区的数据记录在多个.log文件中,一个.log大小大于某个值时,会再创建一个文件存进入Kafka的数据。
kafka的日志段(.log文件)和索引文件(.index文件)
生产者发送到kafka的数据最终是存在log中,每个log都是由一个.log和.index文件组成。数据进来时,将数据追加到.log,将数据在.log中的索引追加到.index。当.log文件达到一定的大小后,kafka会新建一个.log和.index存储之后的数据,文件名字以新的索引起始点命名。
在消费者消费的时候,会记录自己消费的位置的offset偏移量,消费组会先根据这个偏移量确定自己需要消费的数据在哪个日志文件,之后通过二分查找.index索引文件找到自己需要消费的数据的位置。
消费组
概述
kafka可以由多个消费者构成一个消费组去消费topic。
topic的分区会根据消费策略均匀的分配给消费组中的每个消费者。
消费者组的优势
- 高性能
假设一个主题有10个分区,如果没有消费者组,只有一个消费者对这10个分区消费,他的压力肯定大。
如果有了消费者组,组内的成员就可以分担这10个分区的压力,提高消费性能。
- 消费模式灵活
假设有4个消费者订阅一个主题,不同的组合方式就可以形成不同的消费模式。
使用4个消费者组,每组里放一个消费者,利用分区在消费者组间共享的特性,就实现了广播(发布订阅)模式。
只使用一个消费者组,把4个消费者都放在一起,利用分区在组内成员间互斥的特性,就实现了单播(队列)模式。
- 故障容灾和动态扩容
如果只有一个消费者,出现故障后就比较麻烦了,但有了消费者组之后就方便多了。
消费组会对其成员进行管理,在有消费者加入或者退出后,消费者成员列表发生变化,消费组就会执行再平衡的操作。
例如一个消费者宕机后,之前分配给他的分区会重新分配给其他的消费者,实现消费者的故障容错。
同时可以主动在消费组内增加或减少消费者,自动触发重平衡,重新分配topic的分区,适应消费压力的变化。
消费者组Rebalance机制
Rebalance机制的目的是实现负载均衡和容错。当新的消费者加入消费组时,Rebalance过程会将一些分区重新分配给新的消费者,以实现负载均衡。当现有的消费者离开消费组时,Rebalance过程会将它所消费的分区重新分配给其他消费者,以实现容错
Rebalance触发的时机
- 当消费者组中消费的个数发生变化
- topic数目发生变化
- topic分区数发生变化
消费者分区分配策略
Range范围分配策略
RoundRobin轮询策略
Stricky粘性分配策略
- 分区的分配要尽可能的均匀
- 分区的分配尽可能的与上次分配的保持相同