首先我们这篇文章,覆盖kafka所有的面试题,从场景,到kafka特点,从生产者到集群到消费者。
一、kafka特点
分布式流处理平台以其高吞吐、低延迟和可扩展性著称,广泛应用于大数据、实时数据处理和事件驱动架构等场景。
解耦:将系统拆分为独立的模块或服务,通过消息队列或事件总线通信,降低模块间的直接依赖。
异步:生产者不等待消费者响应,继续处理后续任务,消费者在后台异步处理消息。
削峰:通过消息队列缓冲突发流量,将请求平滑分发到后端服务,避免系统过载。
二、kafka模式
模式
核心目标
适用场景
技术栈
生产消费模式
解耦生产者与消费者,异步通信
日志收集、数据同步、异步任务
Kafka + Logstash/Fluentd
发布订阅模式
广播消息到多个订阅者
事件驱动架构、实时通知、指标监控
Kafka + 多个消费者服务
点对点模式
确保消息唯一处理,负载均衡
任务队列、订单处理、削峰填谷
Kafka + 消费者组
事件溯源模式
记录状态变更,支持审计和回放
金融交易、库存管理、游戏状态
Kafka + 事件存储(如 S3、数据库)
CQRS 模式
读写分离,优化性能
高并发读写系统、复杂查询场景、微服务架构
Kafka + 写模型服务 + 查询模型服务
流处理模式
实时处理数据流,生成衍生数据
实时风控、实时推荐、IoT 数据处理、ETL 管道
Kafka Streams/Flink/Spark Streaming
Kafka 的灵活性使其能够支持多种模式,选择时需结合业务需求:
需要解耦和异步:优先生产消费模式或发布订阅模式。
需要消息唯一处理:使用点对点模式(消费者组)。
需要审计和回放:选择事件溯源模式。
需要读写分离:考虑 CQRS 模式。
需要实时处理:采用流处理模式。
三、kafka核心组件
(1)broker(代理服务器)
Kafka集群中的单个服务器节点,负责存储消息、管理Topic和分区,并处理生产者和消费者的请求。
(2)topic主题
消息的逻辑分类或频道,生产者将消息发送到特定Topic,消费者从Topic订阅消息。
多分区设计(提高吞吐量)
(3)partition分区
Topic的物理划分,每个分区是一个独立的消息队列,存储在Broker上。
多个分区被不同的消费者或者消费者组并行消费(提高吞吐量)
单个分区消息顺序存储和消费(消息顺序)
副本机制(数据可靠性)
唯一标识:由topic名称+分区号(order-0)
(4)producer生产者
向Kafka发送消息的客户端应用程序。
通过开启幂等性解决消息重复问题
批量发送提升性能
通过acks参数控制可靠性(0=不确认,1=Leader确认,all=所有ISR确认)
(5)consumer消费者
从Kafka读取消息的客户端应用程序。
消费者拉取消息,避免消费者过载,可通过重置偏移量从新消费或者通过从最早,指定位置,时间进行重复消费(解决消息丢失问题)
(6)consumer group消费者组
由多个消费者组成的逻辑单元,共同消费一个Topic的消息。
增加消费者提高消费能力(消息积压解决方案)
每条消息仅被组内一个消费者消费(避免重复处理)
(7)zookeeper协调服务
分布式协调服务,用于管理Kafka集群的元数据和状态(注:Kafka 2.8+版本支持脱离Zookeeper运行,改用KRaft模式)。
(8)replication副本
为每个分区创建多个副本(Replica),提高数据可靠性和可用性。
leader副本处理所有的读写请求。
isr(in-sync replicas)与leader保持同步的副本集合,仅isr中的副本备选为leader
(9)controller控制器
Kafka集群中的一个特殊Broker,负责管理集群状态和协调操作。
协调leader选举和副本分配
(10)offset偏移量
消费者在分区中的消费位置标识,表示下一条待消费消息的索引。
每个分区偏移量递增,存储在kafka内部topic(__consumer_offsets)
四、生产者消息发送流程
(1)消息创建与序列化
生产者创建要发送的消息,通常包括消息的键(key)和值(value)。
消息在网络中传输的方式只能是二进制,因此需要将消息序列化为二进制形式。Kafka提供了多种内置的序列化器,同时也支持用户自定义序列化逻辑。
(2)分区选择
一个Topic可以被划分为多个分区(Partition),生产者需要根据特定的规则选择消息应该被发送到哪个分区。这通常涉及到负载均衡和数据排序的需求。
分区选择策略包括:指定分区、指定key(通过哈希计算选择分区)、轮询(未指定分区和key时)。
(3)消息缓存
消息被添加到记录收集器(RecordAccumulator)中,该收集器使用双端队列的方式缓存消息。
消息以批的维度存储,即N条消息组成一批,一批消息最多存储N条,超过后则新建一个组来存储新消息。新来的消息总是从左侧写入,即越靠左侧的消息产生的时间越晚。
(4)消息发送
Sender线程从记录收集器中收集满足条件的批数据(如一批数据量达到指定的N条或满足linger.ms条件)发送给Broker。
Sender线程会为每个BrokerId创建一个客户端请求,并将请求交给NetWorkClient,由NetWrokClient去真正发送网络请求到Broker。
NetWorkClient负责客户端与服务端的建连、发送客户端请求、接受服务端响应。
(5)Broker处理
Broker收到消息后,会存储到对应的分区中,并同步副本(如果配置了副本因子)。
Broker处理来自生产者的请求,包括发送消息、拉取消息、提交偏移量等。
五、controller选举
kafka集群启动时,像zookeeper创建临时节点,所有的broker通过leaderChangeListener监听节点变化/brokers/ids,优先从isr列表中最早的那个进行选举。原子性选举,确保唯一的controller,避免脑裂问题。
绥化市网站建设_网站建设公司_UX设计_seo优化