1.面试题:说说你如何保证kafka不丢失消息?面试码k面试
2.Kafka高频面试题总结(2022最新整理)
3.kafka是什么?
4.Kafka面试题及答案整理 110道 (持续更新)
5.Java面试Kafka如何保证消息消费的顺序性?
6.面试问题kafka顺序消费
面试题:说说你如何保证kafka不丢失消息?
本文将详细介绍如何保证Kafka不丢失消息,并给出一些实际案例。源原理在Kafka中,面试码k面试数据以消息的源原理形式存储和传输,因此,面试码k面试保证消息的源原理soundpool源码可靠性是非常重要的。
生产者端配置是面试码k面试保证消息可靠性的重要环节。生产者采用 push 模式将数据发布到 broker,源原理每条消息追加到分区中,面试码k面试顺序写入磁盘。源原理消息写入 Leader 后,面试码k面试Follower 是源原理主动与 Leader 进行同步。在生产者端,面试码k面试可以通过配置参数来保证消息的源原理可靠性,例如配置 request.required.acks 属性,面试码k面试通过这个属性可以控制消息确认的模式:如果配置为 0,则生产者不校验 ACK,如果配置为 1,则保证 leader 不丢,如果配置为 all,则保证 leader 和 follower 不丢。通过合理配置生产者端的参数,可以有效地保证消息的可靠性。
消费者端配置同样重要。消费者通过 pull 模式主动从 kafka 集群拉取消息,与生产者相同的是,消费者在拉取消息时也是找 leader 分区进行拉取。多个消费者可以组成一个消费者组,每个消费者组都有一个组id。同一个消费者组的消费者可以消费同一 topic 下不同分区的数据,但是不会出现多个消费者消费同一分区的数据。消费消息时,消费者可以先 commit 再处理消息,如果在处理消息时发生异常且 offset 已经提交,则该消息对消费者来说就是丢失了。也可以先处理消息再 commit,如果在 commit 之前发生异常,则下次还会消费到该消息,重复消费问题可以通过业务保证消息幂等性来解决。
副本机制是 Kafka 保证数据可靠性的关键之一。在 Kafka 中,每个 Topic 都可以配置多个 Partition,并且每个 Partition 可以配置多个副本。每个 Partition 的副本会分布在不同的 Broker 上,以保证数据的冗余和高可用。副本机制通过复制消息实现,消息首先会被写入到 PageCache 中,然后再异步写入磁盘,即使发生宕机等意外情况,已经写入 PageCache 中的消息也不会丢失。
消息落盘机制是 Kafka 保证消息可靠性的另一个关键。消息在 Kafka 中首先写入到 PageCache 中,然后再异步写入磁盘,因此,即使发生宕机等意外情况,已经写入 PageCache 中的消息也不会丢失。在 Kafka 中,可以通过配置参数来保证消息的落盘,例如配置 sync 参数,控制消息写入磁盘的模式。
实际案例中,假设有一个消息生产者需要将消息发送到 Kafka 中,并且要求消息的可靠性。在生产者端,可以进行如下配置:将acks参数设置为all,电影源码带后台表示只有当消息被写入到所有 Partition 的副本中,并且写入到磁盘后才会认为发送成功;将min.insync.replicas参数设置为2,表示至少有2个 Partition 的副本需要确认写入磁盘后才认为发送成功。在消费者端,可以进行如下配置:在消费消息时,可以使用手动提交offset的方式实现消息的可靠性。
总结而言,在使用 Kafka 时,需要注意消息的可靠性问题,以保证数据不会丢失。为了保证消息的可靠性,可以采用多种方法,包括配置参数、消费者端的手动提交 offset、副本机制和消息落盘机制等。在实际使用中,还需要结合监控工具和告警机制来及时发现并解决问题。
Kafka高频面试题总结(最新整理)
Kafka 的特点:
- 高并发,通过分区实现负载均衡
- 支持消息有序性
- 强大的数据复制机制,通过副本保证数据一致性
- 高吞吐率和低延迟
选择 Kafka 场景:
- 大量数据的实时处理
- 实时流式数据传输
- 高并发下的实时消息消费
Kafka 架构:
- **分区**:实现负载均衡,提高并发度
- **消费者**:高效消费消息
消息有序性:
- 每个分区内的消息顺序写入
- 单个分区由单一消费者消费,保证顺序性
- 分区间消息不保证有序
Kafka Producer 执行过程:
1. 生产消息
2. 找到分区的 Leader
3. 推送消息
4. 通过 ISR 列表通知 Follower
5. Follower 拉取消息,发送 ACK
6. Leader 收到所有副本的 ACK,更新 Offset
Kafka Consumer 线程模型:
- **Thread-Per-Consumer**:利用主题分分区机制,每个线程有自己的 Consumer 实例,消费多个分区
- **并行性**:线程间独立,无同步和通信需求
数据一致性原理:
- Leader 和 Follower 间数据一致
- ISR 列表确保一致性,避免数据丢失
ISR、OSR、AR:
- **ISR**:副本同步队列,Leader 同步数据给 Follower
- **OSR**:出同步副本,超过阈值的 Follower
- **AR**:所有副本集合
LEO、HW、LSO、LW:
- **LEO**:日志文件中下一条消息的位置
- **HW**:消费位置的标识
- **LSO**:事务中第一条消息的位置或完成事务时与 HW 相同
- **LW**:AR 集合中最小的日志文件起始位置
数据传输事务:
- **最多一次**:消息最多传输一次,可能不传输
- **最少一次**:消息不会被漏掉,可能重复
- **精确一次**:确保消息不重复、不遗漏传输
Kafka 消费指定分区消息:
- 消费者通过 offset 控制,可回滚重读
消息传输模式:
- **Pull**:消费者主动从 Broker 拉取消息,灵活批量控制
- **Push**:Broker 推送消息至消费者,受限于消费速率
高效文件存储设计:
- **分割大文件**:定期清理已消费文件,减少磁盘占用
- **索引优化**:快速定位消息,控制响应大小
- **内存映射**:减少磁盘 I/O 操作
- **稀疏存储**:降低索引文件元数据空间需求
Kafka 分区分配:
- 副本数量不超过 Broker 数量
- 首分区随机分配
- 其他分区依次循环分配
再均衡过程:
- 消费者组成员请求加入
- Leader 分配消费方案
- 方案广播至所有成员
高吞吐率实现:
- 分布式存储,优化读写性能
- 大文件分割,灵活数据管理
- 并发消费机制,提升处理速度
Kafka 缺点:
- 较高的系统开销
- 配置复杂度
- 需要较大量存储资源
新旧消费者区别:
- **旧消费者**:简单消费者,功能有限
- **新消费者**:支持消费者组,再均衡机制
分区调整限制:
- **增加分区**:使用命令支持
- **减少分区**:不支持,逻辑复杂,可能导致数据丢失或破坏有序性
通过上述内容,可以清晰地看到 Kafka 在设计上的核心优势和应用场景,以及其在消息处理、数据存储、系统管理等方面的关键机制和特性。
kafka是什么?
面试官:今天要聊消息队列吧?看你项目多次使用Kafka
候选者:嗯嗯
面试官:简单说明下你使用Kafka的场景
候选者:使用消息队列主要目的有解耦、异步和削峰
候选者:比如项目中,消息管理平台系统对外提供接口给业务方调用,接口调用后非同步下发消息,将消息放至消息队列,返回结果,提高接口吞吐量、减轻系统压力。
候选者:广告订单归因工程中,交易团队将订单数据写入消息队列,php云建站源码业务方自行消费使用,解耦业务,流量由消息队列承载,即便下单量激增,下游业务感知不大。
面试官:你觉得消息队列能削峰的原因?
面试官:或者说,Kafka能承载大量QPS的原因?
候选者:消息队列核心功能存储生产数据,给业务方读取,与业务处理操作不同,Kafka在存储、读取过程优化,如并行处理、利用操作系统cache、顺序写磁盘、零拷贝技术。
面试官:解释下零拷贝技术
候选者:零拷贝技术减少CPU拷贝文件次数,如mmap将内核缓冲区与用户空间映射,减少CPU拷贝;sendfile+DMA Scatter/Gather减少上下文切换和CPU拷贝。
面试官:Kafka如何实现零拷贝
候选者:Producer->Broker,Kafka利用mmap技术减少CPU拷贝;Broker->Consumer,使用sendFile实现CPU零拷贝。
面试官:Kafka会丢数据吗?
候选者:使用Kafka时,Producer->Broker、broker间的同步和broker->磁盘等场景可能丢消息,通过使用带有callBack的API、设置acks、retries参数可减少数据丢失。
面试官:消费数据如何保证不丢?
候选者:不使用autoCommit,手动提交offset;批量拉取消息,使用msgId存储,处理后从sortSet删除msgId,提交offset,保证不丢失。
面试官:如何实现幂等性?
候选者:通过订单编号+状态作为幂等Key,查询Redis,处理过的Key丢弃,最终依赖数据库唯一Key保证幂等性。
面试官:遇到过消费顺序问题吗?
候选者:存在,如订单状态流转,消费过程中可能出现乱序,采用宽表和消息补偿机制解决,或确保相同userId/orderId发送到同一partition。
面试官:我推荐一个Java开源消息推送平台项目,拥有全面文档,使用大量中间件,包括SpringBoot、SpringDataJPA、MySQL等,线上环境适用,部署简单,提供前端后台管理系统,社区活跃,可作为面试加分项。
面试官:消息推送平台-Austin设计为真实线上项目,统一消息发送和全链路追踪,适用于公司内部消息需求,提升开发效率,核心流程为austin-api接收请求直接入MQ,austin-handler消费MQ后由Handler处理。
面试官:分享的项目链接和更多资源,包括纯文版、版电子书,旨在帮助初学者学习和复习Java面试题和相关技术知识。
Kafka面试题及答案整理 道 (持续更新)
最新Kafka面试题附答案解析
在Kafka生产者中,vb 打铃系统 源码QueueFullException通常发生在生产者试图以代理身份在当时无法处理的速度发送消息时。为了协作处理增加的负载,用户需要添加足够的代理,因为生产者本身并不会阻止。
估算Kafka集群的机器数量时,SRE通常需要考虑CPU、内存、磁盘容量以及带宽等资源。值得注意的是,Kafka对磁盘的需求相对不高,普通机械硬盘即可满足,而瓶颈通常出现在带宽上。在预估磁盘占用时,需考虑副本同步的开销。如果一条消息占用1KB的磁盘空间,那么在有3个副本的主题中,需要3KB的总空间来保存这条消息。同时,需要考虑到整个业务Topic数据保存的最大时间,以此基本可以预估出磁盘的容量需求。对于磁盘,应提前与业务沟通场景,避免因容量瓶颈而扩容磁盘或寻求业务解决方案。带宽方面,常见的有1Gbps和Gbps,通常需知道当带宽占用接近总带宽的%时,会发生丢包情况。
分区Leader选举策略有四种类型:OfflinePartition Leader选举、ReassignPartition Leader选举、PreferredReplicaPartition Leader选举以及ControlledShutdownPartition Leader选举。OfflinePartition Leader选举发生在分区上线时,包括创建新分区或已下线分区重新上线。ReassignPartition Leader选举则在手动运行Kafka-reassign-partitions命令或调用Admin的alterPartitionReassignments方法执行分区副本重分配时触发。PreferredReplicaPartition Leader选举是手动运行Kafka-preferred-replica-election命令或自动触发的Preferred Leader选举。ControlledShutdownPartition Leader选举则在Broker正常关闭时执行,此时所有Broker上的Leader副本都下线,需要为受影响的分区执行相应的Leader选举。
Kafka中有四个主要组件:主题、生产者、消费者和经纪人。主题是一堆或一组消息的集合;生产者发布通信并向Kafka主题发布消息;消费者订阅一个主题并从主题中读取和处理消息;经纪人负责管理主题中的消息存储。
系统工具有三种类型:Kafka迁移工具,用于将代理从一个版本迁移到另一个版本;Mirror Maker,用于将一个Kafka集群的镜像提供给另一个集群;消费者检查工具,用于显示指定主题集和消费者组的主题、分区和所有者。
传统队列系统与Apache Kafka之间的关键区别在于消息保留、基于逻辑的处理以及消息传输的事务定义。Kafka中,消息即使在处理后仍可保留,允许基于类似消息或事件的逻辑处理,而消息传输则提供了最多一次、最少一次以及精确一次三种事务定义。
连接器API的作用在于允许运行和构建可重用的生产者或消费者的API,将Kafka主题连接到现有的应用程序或数据系统。
消息队列的作用在于实现解耦、异步处理和削峰等。例如,通过使用消息队列,快递小哥可以将同一小区的快递放在便利店,通知收货人自行取件,从而实现快递小哥与收货人之间的解耦,提高工作效率,并在处理双十一等高并发场景时有效管理流量。驱动易语言源码
数据传输的事物定义包括最多一次、最少一次以及精确一次三种级别,确保消息在传输过程中不会被重复发送、漏发送或重复发送,以满足不同场景的需求。
如果不背Kafka面试题的答案,可能在面试中会遇到问题,但本手册已整理成PDF版,希望能帮助大家。
Java面试Kafka如何保证消息消费的顺序性?
在Java面试中,关于Kafka如何确保消息消费顺序性的问题常常被提及。面试官可能会进一步追问是否有其他解决方案。以下是对此问题的深入解析:
首先,Kafka通过分区(Partition)机制确保消息的物理存储顺序。每个topic下可以有多个分区,生产者根据消息的key进行hash计算,决定消息的存储分区。消息在分区内的存储是有序的。
然而,如果一个topic有三个分区,且消息被随机分配到三个消费者,虽然分区内消息有序,但由于网络独立,消费者之间的消费顺序可能不一致,导致乱序。解决办法是自定义分区路由策略,将具有相同key的消息发送到同一分区,并指定单个消费者消费特定分区,从而保证顺序消费。
在采用异步消费模式时,若不控制,单分区也可能导致无序,此时可通过在消费者端使用阻塞队列来管理消息,确保有序消费。面试官提问的另一个挑战是,如何在不将消息路由到同一分区的情况下保持顺序。实际上,Kafka本身并不支持这一点,实现会涉及额外的复杂性且性价比不高。
面试官提问这类问题的目的是测试面试者的分析能力和技术理解深度,而非寻找标准答案。对于面试者而言,重要的是展示清晰的思考过程和扎实的技术基础。最后,如果你有任何关于面试、职业发展或技术学习的问题,可以通过私信进行交流,此外还有Java面试资料和简历模板可供获取。
面试问题kafka顺序消费
在面试过程中,关于Kafka顺序消费的问题经常被提及,这让我深感困惑。初次尝试的回答是,通过配置单个partition,Kafka理论上在该分区内能实现顺序消费。然而,面试官对此并不满意,质疑单partition下的并发性能问题。
尽管在网上搜索了不少资料,常见建议是增加partition数,并将相关消息发送至同一partition。但即便如此,我还是不明白如何实现不同partition下的全局顺序消费。直到遇到实际场景,我才恍然大悟。在股票交易应用中,系统需求的是针对单个股票的行情数据进行顺序处理,而非全局。因此,解决方案是生产者在发送数据到Kafka时,利用股票代码作为key,将相关消息定向到同一partition。这样,消费者就能够同时处理多个partition,又能确保对于特定股票的行情数据进行顺序消费,解决了性能和顺序性的双重需求。
Kafka最新面试题及答案汇总(版)
整理了一些Kafka常见面试题,分享给大家: 1、什么是kafka? Kafka是分布式发布-订阅消息系统,最初由LinkedIn开发,后成为Apache项目的一部分。它用于处理流式数据,是一个分布式、可划分、冗余备份的持久日志服务。 2、为什么要使用kafka和消息队列? 缓冲和削峰:缓冲上游突发流量,下游从容处理。解耦和扩展性:消息队列作为接口层,解耦业务流程,提供扩展能力。冗余:一个生产者发布消息,多个订阅服务消费,无需关心关联性。健壮性:消息堆积,消费端短暂故障不影响业务。异步通信:允许用户非即时处理消息。 3、Kafka中的ISR、AR代表什么? ISR:在同步队列中的副本。AR:所有副本。ISR由leader维护,滞后过长时间或复制请求过少时,leader会剔除其ISR。 4、kafka中的broker是什么? broker作为消息代理,producer向指定topic写消息,consumer从topic拉取消息,broker作为中转站。 5、zookeeper在kafka中起到什么作用? zookeeper为分布式协调组件,早期用于存储meta信息、管理group和offset。新版本减少依赖,但仍用于选举controller和检测broker状态。 6、kafka follower如何与leader同步数据? Kafka采用ISR机制,follower批量从leader复制,利用顺序读和零拷贝技术提高性能。 7、一个 broker 如何被移出 ISR? leader根据同步状态维护ISR,滞后过长时间或请求间隔过长的follower会被移出。 8、kafka为什么那么快? 优化的复制机制、高效的文件操作和消息传输方式。 9、kafka producer如何优化打入速度? 调整配置参数,优化网络环境,合理设置缓存大小。 、设置 ack 为 0, 1, -1 的含义? ack 0: 不确认,消息可能丢失;ack 1: 领导者确认;ack -1: leader和所有follower确认。 、unclean leader election代表什么? 允许不同步副本成为leader,可能导致数据丢失。 、leader crash时,ISR为空怎么办? 启用参数unclean.leader.election.enable,允许非ISR副本成为leader,可能影响数据一致性。 、kafka的message格式? 由header和变长body组成,header包含文件格式、CRC校验和可选的属性,body为具体消息。 、consumer group概念? 逻辑概念,实现单播和广播消息模型。同一topic数据广播给不同group,同一group内只有一个worker消费。 、消息是否会丢失和重复消费? 通过配置确认机制和避免重复消费策略解决。 、为什么Kafka不支持读写分离? 主写主读模型,避免数据一致性问题和延迟。 、Kafka如何体现消息顺序性? 每个partition有序,同一group内一个消费者消费。 、提交消费位移时? 提交当前消费的最新消息offset+1。 、实现延迟队列? 自定义时间轮定时器,基于JDK DelayQueue优化。 、事务实现? 参考相关资料。 、选举机制? kafka中涉及选举的场景和策略。Kafka面试题总结(二)
Apache Kafka是由Apache开发的一种分布式的、分区的和重复的日志服务。它是一个高性能的消息系统,支持发布订阅消息模式,能够处理大量客户端请求,每秒处理数兆字节的读写操作。与传统的消息传递方法相比,Kafka具有以下优势:
1. **高性能**:单一的Kafka代理可以处理成千上万的客户端请求,性能远超传统系统如ActiveMQ、RabbitMQ等,且支持批处理操作。
2. **可扩展性**:Kafka集群可以轻松扩展,通过增加服务器实现集群的扩展性。
3. **容错性**:Kafka使用分区和副本机制,每个分区的数据会复制到多台服务器上,当某个Broker失效时,通过Zookeeper通知生产者和消费者,使用其他可用的Broker。
在Kafka中,broker指的是集群中的Kafka服务器。Zookeeper是Kafka的分布式协调服务,用于维护集群中节点之间的通信。Kafka服务器能够接收的最大消息大小为字节。消费者通过sendfile API传递消息,支持字节Socket转移到磁盘的操作。提高远程用户的吞吐量可以通过调整Socket缓冲区大小,以适应长网络延迟。
在数据生产过程中,为了准确获得Kafka的消息,需要避免消息重复。可以采用每个分区使用单独的写入器,并在遇到网络错误时检查分区中最后一条消息,确认最后一次写入是否成功。同时,消息中可以包含主键(如UUID),并在消费者中进行复制。
ISR(In-Sync Replicas)是一组与leader完全同步的消息副本。当一个副本脱离ISR,它将被从leader中删除,以确保数据一致性。Kafka需要复制以确保消息不会丢失,并能在机器错误、程序错误或软件升级中使用。
如果一个副本在ISR中停留时间过长,表明跟踪器无法快速获取数据。如果首选的副本不在ISR中,控制器将无法将leadership转移到首选副本。在生产后,Kafka不会发生消息偏移,因为broker会完成适当的元数据处理和偏移量等操作,而消费者可以通过从broker中获取包含偏移量的MultiFetchResponse对象来实现。
Kafka支持三种消息投递语义:At most once、At least one和Exactly once。默认情况下,Kafka保证At least once的语义,并允许通过producer异步提交实现At most once。Exactly once要求与目标存储系统协作。Kafka提供的offset功能可以较容易地实现这种方式。
Kafka只能保证一个partition内的消息顺序被某个consumer消费时是正确的,消息在不同partition之间是不全局有序的。数据丢失问题可以通过设置acks=all、合理设置retries和min.insync.replicas参数来防止。消费者可以通过关闭自动提交offset和在处理完数据后再手动提交来避免数据丢失。
Kafka生产者将数据发布到他们选择的主题。生产者可以选择分区以平衡负载或根据消息中的键进行分区。消费者采用pull模式从broker中读取数据,pull模式更适合处理速率不同的消费者,消费者可以自主控制消费速率,同时支持批量或逐条消费,以及不同的提交方式以实现不同的传输语义。
kafka面试,看这一篇就够了
MQ(消息队列)在跨进程通信中的应用为异步RPC,其上游系统对调用结果的态度通常是重要但不紧急。使用MQ的好处包括:业务解耦、流量削峰以及灵活扩展。本文深入探讨了消息中间件Kafka的特性和工作原理。
Kafka是一种分布式的消息引擎,它将消息的主题(Topic)进行归类,每条消息都有其特定的Topic。Kafka通过将Topic物理上划分为一个或多个分区(Partition),每个分区在物理上对应一个文件夹,命名方式为“topicName_partitionIndex”。这种设计使得Kafka的吞吐率能够水平扩展。每个分区相当于一个顺序、不可变的消息队列,支持持续添加消息。消息在分区中被分配了唯一的偏移量(Offset)。
生产者(Producer)向Kafka发送消息,决定消息存储到哪个分区。这可以通过分区算法,如基于分区列表的轮询或根据权重选择分区,或通过自定义算法实现。合理设置分区规则有助于实现负载均衡。
消费者(Consumer)订阅并消费消息,使用ConsumerGroup来标识自己。一个ConsumerGroup可以并发地消费多个分区的消息,但同一分区只能由一个ConsumerGroup内的消费者消费。
Kafka的Producer设计原理包含发送消息流程、幂等性处理和吞吐性优化。Producer将消息序列化后计算分区,然后将消息发送到对应的Broker。实现幂等性通过引入Producer ID和Sequence Number,确保消息的正确处理。Producer与Broker之间的通信采用长连接,使用Sender线程管理消息发送过程,提高吞吐率和降低延迟。
Consumer设计原理基于poll消息机制,使用ConsumerGroup管理消息位移,确保消费者重启后从上次消费位置继续。消息位移信息在Kafka新版本中被集成到消息中,存储在特定Topic中,提高高并发读写性能。
Kafka的Group状态管理包括重平衡机制。当消费者消费不均衡时,Kafka自动执行重平衡,以重新分配分区。新版本增加了group.initial.rebalance.delay.ms参数,减少重平衡次数,优化性能。
Broker作为Kafka集群的节点,负责处理生产者发送的消息和消费者的请求。每台Broker保存相同的状态数据,包括负载均衡策略,确保分区数量和硬盘占用大小均匀分布。Kafka通过结合同步复制和异步复制实现高可用性,确保数据不丢失并提高吞吐率。
Kafka的高性能通过业务方对Producer的优化实现,包括内存管理和网络优化等策略,进一步提升系统性能。
本文内容转载自微信公众号WeCoding,原文链接可在线查看。请在转载时在文章开头和结尾加粗上述内容以确保版权信息的完整和正确引用。
Kafka面试题精选
Apache Kafka是一个分布式消息系统,用于高效处理大量数据。它允许消息从一个端点传递到另一个端点,适用于离线和在线消息消费。Kafka在磁盘上存储消息,并通过集群复制机制防止数据丢失。Kafka构建在ZooKeeper服务上,与Apache Storm和Spark集成,用于实时数据分析。
在Kafka架构中,服务器(Broker)包含多个主题(Topic)、分区(Partition)和副本(Replica)。Broker负责协调生产者(Producer)和消费者(Consumer)。主从结构中,主节点为控制器(Controller),从节点为从节点。Broker在启动时向Zookeeper注册信息,先注册的成为Controller,负责生成集群元数据,并分发给其他服务器,让它们感知集群中的其他成员。
每个Topic的消息会存储在多个Partition中,以确保高可用性。Partition可以理解为将标准队列的消息进行拆分,每条消息由生产者根据键和分区数进行哈希后投递。一个分区只能被同一消费者组(Consumer Group)中的一个消费者消费,且分区内的消费顺序是有保证的。
每个Partition都有一个或多个副本,副本数量不超过Broker数量。Leader是维护与副本基本保持同步的Replica列表的节点,动态维护ISR(In-Sync Replica)列表。Follower用于复制Leader的数据,采用pull模式。配置参数如`default.replication.factor`和`replication-factor`用于设置副本数量。
水印备份机制通过LEO(Last End Offset)和HW(High Watermark)实现。LEO记录副本中下一条消息的位置,Follower每次fetch请求时会携带当前LEO,Leader选择最小的LEO更新HW。HW小于等于LEO,小于HW的消息被认为是已提交或已备份消息,对消费者可见。
消息丢失和重复可通过手动确认ACK和幂等处理解决。Consumer Group在Kafka中用于消费Topic中的分区,保证同一条消息不会被不同消费者消费。分区规则有RangeAssignor和RoundRobinAssignor,默认为RangeAssignor,通过排序分配Broker和Partition。
Rebalance是一种协议,规定消费者组内的所有消费者如何一致地分配订阅Topic的每个分区。Rebalance发生时,所有消费者停止工作,直到完成。Group Coordinator存储组的元信息,记录分区的偏移量到Kafka内部主题(`__consumer_offsets`)中。
触发Rebalance的条件包括组成员数量变化、订阅的Topic消费者组数量变化或分区数量变化。Rebalance过程分为Join和Sync两步:加入组后,Leader分配消费方案,封装SyncGroup请求发给Coordinator,所有消费者接收方案并开始消费。
避免Rebalance的核心在于控制组成员数量和分区数量的稳定。Kafka的高性能和高吞吐量得益于Partition为分界线的消费模式,允许并发量限制于Partition数量。顺序写和日志索引机制使得Kafka能够高效处理TB级别的数据。
批发送、数据压缩、Page Cache和MMap机制是Kafka提高性能的关键。批发送减少网络传输开销,数据压缩降低数据量,Page Cache和MMap允许直接内存访问,减少磁盘访问和用户态到内核态的切换。
Kafka在生产消费过程中利用Page Cache,生产时直接写入,消费时经过Page Cache。配置消息至少有一个副本接受可以避免数据丢失。Kafka选择利用Page Cache而非自己管理缓存,避免对象开销、GC影响和程序崩溃导致的数据丢失。