kafka接收的消息是保存在topic下的patition分区上的,默认一个topic下只有一个patition,但是为了提高效率会配置每个topic下有多个patition分区,为了保证数据的稳定性,每个patition还会有多个副本(每个patition分区的副本包含一个leader副本和多个follower副本),不同的副本保存在不同的服务器上,这样能保证一台服务器挂掉了,可以选举其他服务器上的follower副本成为新的leader
注释:leader副本作用:负责处理该分区所有的读写请求、Leader副本还负责将写入的数据同步到Follower副本,确保数据的一致性。
follower副本的作用:Follower副本不直接处理读写请求,它们从Leader副本接收数据,并确保自己的数据与Leader保持一致。
下边是常见面试题:
1、kafka特点:
答:
kafak是一种高吞吐量的分布式发布订阅式消息系统,高吞吐量、低延迟:kafka每秒可以处理几十万条消息;
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
容错性:有副本机制保证消息的稳定性
2、kafka如何防止数据丢失的?
答:
(1)、数据复制
Kafka 允许为每个 topic 配置多个副本(replicas)。默认情况下,一个 topic 会有一个 leader 副本和多个 follower 副本。所有读写操作都通过 leader 副本进行。如果 leader 副本发生故障,follower 副本可以选举为新的 leader,从而实现高可用性和容错能力。
(2)、确认机制
生产者端---------------->生产者端要保证消息成功发送到消息队列的topic的partition分区上
在 Kafka 中,生产者确认机制是指生产者在发送消息到 Kafka 集群后,根据配置的确认级别(acks)等待来自 Kafka 集群的响应。这是确保消息不会丢失的关键步骤。 以下是生产者确认机制的具体实现步骤和 Java 示例:
1)、生产者确认机制的实现步骤:
配置生产者属性:在生产者配置中设置 acks 参数,这个参数决定了生产者在发送消息后需要从 Kafka 集群接收多少确认。
发送消息:生产者发送消息到 Kafka 主题。
等待确认:根据 acks 参数的设置,生产者会等待来自 Kafka 集群的相应数量的确认。
处理确认响应:生产者根据收到的确认响应来确定消息是否成功发送。
错误处理:如果消息发送失败,生产者可以根据配置的重试策略进行重试。
2)、 Kafka 生产者确认级别(acks 参数):
acks=0:生产者不等待任何来自服务器的确认,继续发送下一条。
acks=1:只要集群的 leader 接收到消息,生产者就会收到确认。
acks=all:只有当所有同步副本(ISR,In-Sync Replicas)都接收到消息时,生产者才会收到确认。
注释:ISR:就是当前topic下partition分区leader的所有副本集合
消费者端-------------------->
1)、关闭自动提交 offset 是 Kafka 消费者的一个重要配置,它允许消费者在完全处理完消息之后才手动提交 offset,从而避免在消息处理过程中发生故障导致消息丢失。以下是关闭自动提交 offset 的具体实现步骤和 Java 示例,以及结合实际业务场景的详细解释:
2)、关闭自动提交 offset 的实现步骤:
理解业务需求:评估业务对消息处理的可靠性要求,确定是否需要关闭自动提交 offset。
修改消费者配置:在消费者配置中设置 enable.auto.commit 为 false,以禁用自动提交 offset。
手动提交 offset:在消息处理完成后,手动提交该消息的 offset。
注释:offset是什么,offset是消费者消费patition分区上消息的位置下标或者叫偏移量,就是当前消费者消费到哪里了
注释:生产者发送消息到消息队列之后,消费者每次拉取一定数量的消息去消费(默认500条消息,也可以自定义poll拉取的消息个数),如果队列中没有那么多消息,消费者就等待,直到消息数量达到一次拉取的数量或者超过了超时时间,他才会poll拉取消息进行消费
以上问题的口语化回答:kafka防止数据不丢失首先就是因为它有副本机制,每个topic都会有多个副本,然后就是它还有个确认机制需要配置acks参数,acks=0是生产者发送完消息之后继续发送下一条,不管消息队列有没有接收到,这种方式可能导致数据丢失;acks=1是只要消费队列里topic下的leader接收到消息,生产者就会收到确认;acks=all是只有当所有消息队列的同步副本(ISR)都接收到消息,生产者才会收到确认。消费者端就是需要取消自动提交offset,就是当该次拉取的消息都处理完之后再统一提交offset
3、kafka如何保证消息消费的顺序性?
答:
(1)、kafka一个topic的patition分区上的消息是按顺序存取的,所以可以设置每个topic只有一个patition来保证消息的顺序性;
(2)、如果有多个patition分区还想保证消息的顺序性,生产者发送消息时对需要保证顺序性的消息设置同一个key,这样就能保证这些消息被发送到同一个patition分区上,这样也能保证消息的顺序性;
注释:ProducerRecord<String,String> record = new ProducerRecord<>(topic,key,value),
这是生产者发送消息时需要创建的一个发送对象,这里能看到可以传你要发送到的topic,以及可以指定key,如果不指定key的话,消息会被随机发送到topic下的potition分区上
4、kafka如何保证消息不重复消费?
答:
在使用Apache Kafka时,确保消息不重复消费是一个重要的需求,尤其是在处理金融交易、订单确认等关键业务逻辑时。Kafka本身并不直接提供防止消息重复消费的机制,但是可以通过一些策略和配置来帮助实现这一目标。以下是一些常用的方法:
(1)、使用唯一标识
确保每条消息都有一个唯一标识(如UUID),消费者在处理每条消息时,可以检查该消息是否已经被处理过。例如,可以使用一个外部存储(如数据库、Redis等)来记录已经处理过的消息ID。
(2)、幂等性生产者
从Kafka 0.11.0.0版本开始,Kafka引入了幂等性生产者(Idempotent Producers)的配置。启用此功能后,即使相同的消息被发送多次,消费者也只会看到一次。
(3)、事务性消息
Kafka的事务支持可以确保一系列消息的原子性,从而防止消息重复消费。使用事务可以确保要么所有消息都被提交,要么都不被提交。
(4)、消费者偏移量管理
正确管理消费者的偏移量也是防止重复消费的关键。确保消费者在处理消息失败时能正确回滚偏移量,或者在重启后能从正确的位置重新开始消费。
最后kafka里还有两个关键字需要了解:
1、LEO(Log End Offset):就是下一条消息要写入的位置。
2、HW(High Watermark):俗称高水位,HW是一个分区的消息复制进度的指示器,表示已经成功复制到所有副本的消息的位置,消费者只能读取该patition分区HW之前的消息,因为HW之后的消息还没有完全同步到其他副本,不安全,数据有可能丢失;
比如:一个topic下的一个patition分区有一个leader、两个follower副本,如果leader的LEO=1000,其中一个follower的LEO=900,另一个follower的LEO=880
因为HW是由所有副本中 LEO 的最小值决定的,因为 HW 表示所有副本都已复制的消息偏移量。因此,HW 是 880。
总结:
该分区的 HW 是 880。
消费者只能读取到偏移量 879 及之前的消息。
有问题欢迎指出,谢谢