Kafka 面试题 001 - 010

001、kafka 的消息模型是什么?

发布订阅模型。

Topic 是通信载体,发布者发送消息到 Topic,订阅了 Topic 的消费者可以消费到消息。在 kafka 中一个 Topic 可以有多个分区。

002、什么是Producer、Consumer、Broker、Topic、Partition?

producer 是产生消息的一方

consumer 是消费消息的一方

broker 相当于一个 kafka 实例,多个 broker 可以组成集群

topic:producer 将消息发送到 topic,consumer 可以订阅 topic 消费其对应的消息

partition 属于 topic 的一部分,一个 topic 可以包含多个 partition,并且同一 Topic 下的 Partition 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker

003、kafka 的多副本机制是什么?

多副本机制是针对分区而言的,同一个分区可以设定多个相同的副本,其中一个叫做 leader,其他叫做 follower,生产者和消费者只和 leader 交互,生产者生产的消息发送到 leader 之后,其他 follower 才能同从 leader 中同步消息。当 leader 发生故障的时候会从 follower 中选择一个称为新的leader。

Kafka 的多分区(Partition)以及多副本(Replica)机制有什么好处呢?

Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。

Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。

004、zookeeper 在 kafka 中的作用?

用于进行 broker 和 topic 的注册。

005、kafka 如何保证消息的消费顺序?

一个topic只设置一个partition。

发送消息的时候指定 Partition。

006、kafka 如何保证消息不丢失?

生产者(Producer) 调用send方法发送消息之后,消息可能因为网络问题并没有发送过去,可以在发送消息的时候加一个回调函数,如果发送失败检查原因重发即可。

消费者从某个分区拉取到一个消息后会自动提交一个offset,但假如消费者提交完offset后还没有消费数据就突然挂掉了,也就是说消息实际上并没有消费但是offset却提交了,相当于消息丢失,解决办法也很简单,关闭自动提交,等消息彻底消费了再手动提交(其实这样也有问题,消息消费了还没提交offset的时候服务挂掉了,相当于消息重复消费了)。

kafka也有可能弄丢消息,比如leader突然挂掉了但数据还没有完全同步到follower,解决办法很简单,设置 acks = all,默认情况下acks= 1,表示数据发送到leader就算成功了,acks=all表示所有副本都要接收到该消息后才算发送成功。

007、如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

拿 kafka 来举例,消费者消费消息后还没来得及提交offset就挂掉了,这样就会造成消息重复消费。

那如何避免呢?需要我们编写代码来保证消费的幂等性,即就算重复消费也要保证数据是正确的。

  • 比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update 一下好吧。
  • 比如你是写 Redis,那没问题了,反正每次都是 set,天然幂等性。
  • 比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个 id 去比如 Redis 里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个 id 写 Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。
  • 比如基于数据库的唯一索引来保证重复数据不会重复插入多条。因为有唯一索引约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。

反正具体业务具体分析,编写代码的时候要保证幂等性。

008、

009、

010、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值