Kafka 面试题

发布时间 2023-06-08 17:00:08作者: xfcoding

1. 为什么要使用 Kafka,为什么要使用消息队列

  1. 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,Kafka 在中间可以起到一个缓冲的作用,把消息暂存在 Kafka 中,下游服务就可以按照自己的节奏进行慢慢处理。
  2. 解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
  3. 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅 topic 的服务消费到,供多个毫无关联的业务使用。
  4. 健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
  5. 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

2. Kafka 的 consumer 是推还是拉?

  • Kafka 遵循了一种大部分消息系统共同的设计:producer 将消息推送到 broker,consumer 从 broker 拉取消息。
  • Push 模式主动将消息推送到下游 consumer 的做法有好处也有坏处,好处是 consumer 能以最大的速率最快速的消费消息,但是在 push 模式下,当 broker 推送的速率远大于 consumer 消费的速率时,consumer 可能会崩溃。所以,由 broker 决定消息推送的速率,对于不同消费速率的consumer 不好处理。
  • Pull 模式的好处: consumer 可以自主决定是否批量的从 broker 拉取数据。Push 模式无需考虑下游 consumer 消费能力和消费策略。如果为了避免 consumer 崩溃而采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。
  • Pull 模式有个缺点是,如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询,直到新消息到达。为了避免这点,Kafka 有个参数可以让 consumer 阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发送)。