Kafka 面试题之《通俗易懂》

上一篇

21、Kafka为什么那么快?

  1. Cache Filesystem Cache PageCache缓存

  2. 顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。

  3. Zero-copy 零拷技术减少拷贝次数

  4. Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。

  5. Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符。

22、Kafka 消息是采用 Pull 模式,还是 Push 模式?

Kafka 最初考虑的问题是,customer 应该从 brokes 拉取消息还是 brokers 将消息推送到

consumer,也就是 pull 还 push。在这方面,Kafka 遵循了一种大部分消息系统共同的传统

的设计:

producer 将消息推送到 broker,consumer 从 broker 拉取消息

一些消息系统比如 Scribe 和 Apache Flume 采用了 push 模式,将消息推送到下游的

consumer。

这样做有好处也有坏处:由 broker 决定消息推送的速率,对于不同消费速率的

consumer 就不太好处理了。消息系统都致力于让 consumer 以最大的速率最快速的消费消

息,但不幸的是,push 模式下,当 broker 推送的速率远大于 consumer 消费的速率时,

consumer 恐怕就要崩溃了。最终 Kafka 还是选取了传统的 pull 模式

Pull 模式的另外一个好处是 consumer 可以自主决定是否批量的从 broker 拉取数据。Push

模式必须在不知道下游 consumer 消费能力和消费策略的情况下决定是立即推送每条消息还

是缓存之后批量推送。如果为了避免 consumer 崩溃而采用较低的推送速率,将可能导致一

次只推送较少的消息而造成浪费。Pull 模式下,consumer 就可以根据自己的消费能力去决

定这些策略

Pull 有个缺点是,如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询,

直到新消息到 t 达。为了避免这点,Kafka 有个参数可以让 consumer 阻塞知道新消息到达

(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发

23、Kafka Producer 写数据,ACK 为 0,1,-1 时分别代表什么?

1(默认) 数据发送到Kafka后,经过leader成功接收消息的的确认,就算是发送成功了。在这种情况下,如果leader宕机了,则会丢失数据。

0 生产者将数据发送出去就不管了,不去等待任何返回。这种情况下数据传输效率最高,但是数据可靠性确是最低的。

-1 producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。

24、ISR在Kafka环境中代表什么?

ISR指的是同步副本。这些通常被分类为一组消息副本,它们被同步为领导者。

25、Kafka的一些最显著的应用。

Netflix,Mozilla,Oracle

26、kafaka 生产数据时数据的分组策略

1、 生产者决定数据产生到集群的哪个 partition 中

2、 每一条消息都是以(key,value)格式

3、 Key 是由生产者发送数据传入

4、 所以生产者(key)决定了数据产生到集群的哪个 partition

27、Leader总是-1,怎么破?

1、 对于有经验的SRE来讲,早期的Kafka版本应该多多少少都遇到过该种情况,通常情况下就是Controller不工作了,导致无法分配leader,那既然知道问题后,解决方案也就很简单了。重启Controller节点上的Kafka进程,让其他节点重新注册Controller角色,但是如上面ZooKeeper的作用,你要知道为什么Controller可以自动注册。

2、 当然了,当你知道controller的注册机制后,你也可以说:删除ZooKeeper节点/controller,触发Controller重选举。Controller重选举能够为所有主题分区重刷分区状态,可以有效解决因不一致导致的 Leader 不可用问题。但是,需要注意的是,直接操作ZooKeeper是一件风险很大的操作,就好比在Linux中执行了rm -rf /xxx一样,如果在/和xxx之间不小心多了几个空格,那”恭喜你”,今年白干了。

28、Java在Apache Kafka中的重要性是什么?

为了满足Kafka标准的高处理速率需求,我们可以使用java语言。此外,对于Kafka的消费者客户,Java也提供了良好的社区支持。所以,我们可以说在Java中实现Kafka是一个正确的选择。

29、什么是消费者组?

消费者组的概念是Apache Kafka独有的。基本上,每个Kafka消费群体都由一个或多个共同消费一组订阅主题的消费者组成。

30、为什么需要消息系统,MySQL不能满足需求吗?

1、 解耦:

允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2、 冗余:

消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

3、 扩展性:

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。

4、 灵活性 & 峰值处理能力:

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5、 可恢复性:

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

6、 顺序保证:

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)

7、 缓冲:

有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

8、 异步通信:

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

31、Kafka如何调优

1.硬件选择

服务器个数 内存、磁盘的大小 服务器台数= 2 (生产者峰值生产速率 副本 / 100) + 1 括号内向上进位 所以为1 假如峰值是20m/s 副本为2 那么应该是3台

2.生产者调优

buffer.memory 默认是32兆 可增大 batch.size 默认是16K 可增大 linger.ms 默认是0S 表示直接发送 可设置为1-5ms acks 默认是-1 假如只是日志数据 可设置为1 retries 重试次数 默认是int最大值 max.in.flight.requests.per.connection 允许最大没有ack值返回的个数 默认是5 compression.type 默认是none 支持none、gzip、snappy、lz4 和 zstd

2.broker调优

修改分区数 (只能增大 不能减小) 增加副本因子 leader负载均衡 默认是开启 建议关闭或者调大负载均衡触发的阈值 自动创建主题 (为了安全性着想,建议关闭)

3.消费者调优

指定offset消费 增大吞吐量:

增大poll 默认最大500条 Fetch.max.bytes每批次最大抓取大小,默认50m

32、Kafka核心api

使用 Producer API 发布消息到kafka集群中一个或多个topic。 (重点掌握)

使用 Consumer API 来订阅一个或多个topic,并处理产生的消息。 (重点掌握)

使用 Streams API 充当一个流处理器,从1个或多个topic消费输入流,并生产输出流到1个或多个输出topic,有效地将输入流转换到输出流。

使用Connector API可以构建和运行可重复使用的生产者或消费者,将topic连接到现有的应用程序或数据系统。例如,针对关系型数据库的连接器可以捕获到表的每个变化。
#秋招##面试题目##小码哥带你圆梦大厂##搞技术你要知道##内推#
小码哥高频面经及八股文 文章被收录于专栏

宝剑锋从磨砺出,梅花香自苦寒来,我是小码哥为你圆梦大厂少走弯路,值得关注。

全部评论
占楼,讲的很好,仓库吃灰等我学到再看
点赞 回复 分享
发布于 2022-10-26 22:08 湖北

相关推荐

嗷佛快来快来快快快来:我当时就是听了别人的谣言,环境的大变,左右摇摆不定,到最后一事无成。我也给你提不了什么有效的建议,因为我自己就是败犬。但是我确实是从cpp转到了Java,cpp也做过项目,了解过具体的细分方向。如果你感兴趣,不会拦你。因为只要一件事情能坚持下去 就会发光
点赞 评论 收藏
分享
评论
8
33
分享

创作者周榜

更多
牛客网
牛客企业服务