kafka其他面试题
一、kafka相关概念
Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker;
Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic;
物理上Topic的消息分开存储,如上图topic1和topic2的消息即使在同一台机器中也是分开存储的;逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处
Partition
Parition是物理上的概念,每个Topic包含一个或多个Partition,如上图topic1的消息分开存储在了partition0和partition1中;
Producer
负责发布消息到Kafka broker;
Consumer
消息消费者,向Kafka broker读取消息的客户端;
Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group);
Consumer 是以 Consumer Group 消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。如果一个消费者失败了,那么其他的 group 成员会自动负载均衡读取之前失败的消费者读取的分区;
二、kafka如何防止重复消费消息或者丢失消息
1,防止重复消费消息
topic的partition中的消息消费到哪里了,由消费者提交offset来实现;
消费者业务代码在消费消息前在数据库或redis记录offset,然后即使消费成功后没有提交offset,下次消费时会先查询数据库或redis有没有消费记录,有消费记录则不会重复消费;但是如果消费失败了,会导致消息丢失;
2,防止消息丢失
生产者producer发送的消息在途中丢失了,可以让producer发送消息后等待响应,如果响应成功说明producer发送消息到broker成功了;
消费者消费消息失败了,那么这个消息也丢失了;可以让消费者消费消息成功后再提交offset,但是如果消费消息成功,提交offset失败了,会导致消费者重复消费消息;在消费前记录数据库或redis但是消费失败会导致消息丢失,在消费后记录数据库或redis但是记录失败会导致消息重复消费;
3,总结
kafka好像无法既做到防止重复消费消息,又做到防止丢失消息,只能除了做到上述说的以外,保证代码的健壮性,做好异常的捕获与处理;