Kafka 面试题

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

1、使用消息队列的目的:

  • 服务解耦
  • 流量削峰
  • 异步通信

在早期的 web 应用程序开发中,当请求量突然上来了时候,我们会将要处理的数据推送到一个队列通道中,然后另起一个线程来不断轮训拉取队列中的数据,从而加快程序的运行效率。

但是随着请求量不断的增大,并且队列通道的数据一致处于高负载,在这种情况下,应用程序的内存占用率会非常高,稍有不慎,会出现内存不足,造成程序内存溢出,从而导致服务不可用。

随着业务量的不断扩张,在一个应用程序内,使用这种模式已然无法满足需求,因此之后,就诞生了各种消息中间件,例如 ActiveMQ、RabbitMQ、RocketMQ 等中间件。

采用这种模型,本质就是将要推送的数据,不再存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。

引入消息中间件之后,整个服务开发会变得更加简单,各负其责。

而且,如果是微服务之间的数据交互不需要同步的话,可放入 Kafka,由消费者自由消费,达到异步通信的效果。

2、为什么选择 Kafka?Kafka 最大的特点是消费速度快。

2. Kafka 的 consumer 是推还是拉?

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

参考资料

https://zhuanlan.zhihu.com/p/442468709

posted @ 2023-06-08 16:52  xfcoding  阅读(19)  评论(0编辑  收藏  举报