大家好,我是锋哥。本日分享关于【Kafka怎样包管消息可靠?】面试题。盼望对大家有帮助;
Kafka怎样包管消息可靠?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
Kafka通过多种机制来确保消息的可靠性,主要包罗数据的持久化、复制、acknowledgment机制、消息顺序包管和消耗者的偏移量管理等。以下是Kafka怎样包管消息可靠的具体说明:
1. 消息持久化(Durability)
Kafka通过将消息写入磁盘来包管消息的持久性,即使体系瓦解或重启,消息也不会丢失。
- 消息日记:每个分区的消息都被持久化为一个日记文件。Kafka将消息以顺序写入的方式存储在磁盘中,这样即使Kafka节点发生故障,磁盘中的日记也能包管消息不丢失。
- 日记段与清理:Kafka会把消息写入分段的日记文件中,并定期清理已过期或不再需要的消息(如果设置了过期时间或大小限制)。
2. 消息复制(Replication)
Kafka通过消息的复制来增强数据的可靠性和容错性。每个主题的分区都会有多个副本,这些副本分布在不同的Kafka broker上。
- 副本因子(Replication Factor):每个主题的分区可以配置副本因子。副本因子指定每个分区要保留多少个副本(副本的数量)。默认情况下,副本因子为3,意味着每个分区有3个副本,存储在不同的Broker上。
- 领导者与跟随者(Leader and Followers):每个分区有一个领导者(Leader)副本和多个跟随者(Follower)副本。所有的生产者和消耗者都与分区的领导者副本交互。跟随者副本从领导者副本同步数据,以包管数据冗余。
- 如果领导者副本失败,Kafka会主动推选一个跟随者副本成为新的领导者,确保服务不中断。
- 生产者写入数据时,默认会等待所有副本(包罗跟随者)同步完数据后再确认写入乐成,这进步了消息的可靠性。
3. acknowledgment机制(Producer Acknowledgment)
Kafka的生产者在发送消息时,可以根据不同的ack设置,控制消息的可靠性。具体的ack设置有三个品级:
- acks=0:生产者发送消息后不等待任何确认,消息写入大概丢失,速率最快,但可靠性最低。
- acks=1:生产者发送消息后等待领导者副本确认写入乐成,只要领导者副本乐成写入就认为消息发送乐成。如果领导者挂掉而未同步到跟随者,消息有大概丢失。
- acks=all(即acks=-1):生产者发送消息后等待所有副本(包罗领导者和跟随者)确认写入乐成。如果任何副本未乐成确认,消息写入会失败。这是最可靠的设置,包管了消息不会丢失,但会增加延迟。
4. 消息顺序包管(Message Ordering)
Kafka包管在单个分区内的消息顺序。在同一个分区中,消息是按生产者写入顺序存储的,并且消耗者也按顺序消耗消息。
- 分区的顺序性:每个分区是一个有序的队列,Kafka确保消耗者按顺序消耗每个分区的消息。然而,跨分区的顺序无法包管。
- 生产者的顺序性:默认情况下,Kafka生产者会按发送顺序将消息发送到指定的分区。可以通过指定分区键来控制消息发送到特定分区,从而确保同一键的消息顺序性。
5. 消耗者偏移量管理(Consumer Offset Management)
Kafka通过消耗者提交偏移量来包管消息的消耗进度,确保消息不会丢失,也不会重复消耗。
- 偏移量的存储:每个消耗者组的消耗进度(即偏移量)会生存在Kafka内部的特殊主题__consumer_offsets中。当消耗者消耗完消息后,它会提交偏移量,Kafka记录下这个消耗点。即使消耗者瓦解,也可以从上次提交的偏移量开始继续消耗。
- 手动提交与主动提交:消耗者可以选择手动提交偏移量或主动提交。手动提交可以确保更精确的控制,避免在消息处理失败时提交织误的偏移量。
6. 幂等性(Idempotence)
为了避免重复消息,Kafka 2.0及以上版本引入了生产者的幂等性机制,确保在网络故障或重试的情况下,不会发送重复的消息。
- 生产者在发送消息时,Kafka会为每个消息分配一个唯一的消息ID,以包管相同的消息不会被重复写入。
- 开启生产者的幂等性后,Kafka会根据消息ID来去重,确保即使生产者重试,消息仍然是唯一的,不会被重复消耗。
7. 配置高可用性与容错性
Kafka的计划答应通过多个Broker实现高可用性,体系可以容忍一定命量的Broker故障。具体计谋包罗:
- 分布式摆设:Kafka集群中的每个Broker都可以承载多个分区副本。即使某些Broker宕机,其他Broker的副本仍然能够提供服务。
- 主动领导者推选:如果分区的领导者副本挂掉,Kafka会主动推选新的领导者,从而确保消息生产和消耗不受影响。
8. 日记清理与过期消息
Kafka支持日记清理机制,可以主动删除过期或不再需要的消息。具体包罗:
- 基于时间的清理:可以配置消息的保留时间(如1天),超过保留时间的消息会被删除。
- 基于大小的清理:可以设置每个分区日记的最大大小,当日记文件大小超过阈值时,会开始清理旧消息。
总结
Kafka通过以下几种机制来确保消息的可靠性:
- 消息持久化:将消息写入磁盘,包管数据不会丢失。
- 消息复制:通过副本包管数据的冗余和容错本领。
- 生产者确认(ack)机制:根据不同的ack设置包管消息的可靠性。
- 消耗者偏移量管理:确保消息不会丢失,也不会重复消耗。
- 幂等性机制:防止生产者发送重复消息。
- 主动领导者推选:包管体系在Broker故障时的高可用性。
这些机制共同作用,确保了Kafka在分布式环境中的高可靠性、数据持久性和容错性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |