千家信息网

Kafka的面试题有哪些

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,本篇内容主要讲解"Kafka的面试题有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Kafka的面试题有哪些"吧!1. RangeAssignor和R
千家信息网最后更新 2024年11月22日Kafka的面试题有哪些

本篇内容主要讲解"Kafka的面试题有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Kafka的面试题有哪些"吧!

1. RangeAssignor和RoundRobinAssignor的区别,感觉没有区别

答:区别:

按照范围来分配:

对所有消费者按照字典序排序,每个主题中的分区数值序排序。

对主题的各个分区分堆,每个消费者分配一堆。

基于主题的;

一个主题的情况下,将主题的分区分配到消费组的各个消费者:

保证消费者分配的分区数差值最大为1

如果消费组订阅了两个主题,则按照区域,依次对每个主题的分区进行分配:

会导致消费组中不同消费者分配到的分区数差值大于1

轮询的方式列出所有订阅的主题分区,列出所有的消费者线程

对主题分区排序,对消费者排序。

不同消费者分配的分区数,最多多一个,消费者分配的分区数最大差值也就是1而已。

消费组订阅多个分区的时候:

2 生产消息的时候,重试次数到了还失败,缓冲区的那条数据会清掉了吧?是不是要靠客户端捕获异常存下那个消息?

答:是的,需要客户端处理,但是不用捕获异常,直接判断即可。

下面是Sender线程发送消息,处理消息重试主要逻辑的源码展示:

Sender线程:

负责从消息累加器获取消息,并发送:

run方法的实现:

上图中的方法最后,发送消息:

sendProducerData的实现:

上图中的方法最后,调用sendProduceRequests方法发送消息:

上图中sendProduceRequest方法的实现:(注意,此时是单数形式,不是复数形式,也就是说该方法发送单一消息批。)

上图中的方法最后,创建请求对象,发送请求:

callback的handleProduceResponse方法实现:

completeBatch方法实现:

如果消息批在发送的时候出现错误,则先判断是否可以重试,如果可以重试,就将消息批重新入列,等待重新发送:

上图中的canRetry实现:

判断当前消息批是否可以重试,如果可以重试,就需要重试:

将消息批重新入列:

将需要重试的消息批重新入列以待重试:

completeBatch方法中,如果重试次数耗尽,则执行以下代码:

)

failBatch的实现:

上图中调用的方法:

上图中的方法中最后,从累加器中释放该失败的消息批。

问题在于:如果我们发送的消息,重试次数耗尽了,我如何知道是哪个消息发送失败?

如果我想将该失败的消息放到其他的地方,比如进行手动补偿,如何获取该失败的消息?

3. dome1 启动不了,需要配置advertised.listeners 才能启动 是什么原因

名称说明类型默认值重要程度
advertised.listeners如果供客户端使用的监听器地址不同于listeners配置的值,需要使用该属性将监听器注册到zookeeper上。在IaaS环境下,该值一般与broker绑定的地址不同。如果不设置的话,使用listeners的值。跟listeners不同的是该地址不允许指定到0.0.0.0。stringnullhigh
listeners逗号分隔的监听器地址监听器名称列表。如果监听器使用的不是安全协议,需要同时设置listener.security.protocol.map的值。将hostname设置为0.0.0.0会绑定到所有网络接口。如果不设置hostname就绑定到默认的网络接口。示例:PLAINTEXT://myhost:9092,SSL://:9091
CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093
stringnullhigh
inter.broker.listener.namebroker之间通信使用的监听器名称。如果该属性不设置,则使用security.inter.broker.protocol设置的值。不要和security.inter.broker.protocol属性一起使用。stringnullmedium
security.inter.broker.protocolbroker之间通信使用的安全协议。选项包括:PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL。不要与inter.broker.listener.name属性一起配置使用。stringPLAINTEXTmedium
listener.security.protocol.map监听器名称安全协议的映射关系。当多个端口或IP地址使用同一个安全协议的时候,必须配置。例如:内部和外部通信可以使用本配置隔离开,即使在它们都使用SSL。具体来说,用户可以定义监听器名称为INTERNAL和EXTERNAL的监听器,此时该属性的配置为:INTERNAL:SSL,EXTERNAL:SSL。键和值使用冒号隔开,键值对使用逗号隔开。每个监听器名称在配置中只能出现一次。不同安全协议(SSL和SASL)的配置,可以对每个监听器添加一个归一化的前缀(监听器名称小写)来配置。例如:要为INTERNAL监听器配置不同的keystore,则名字为:
listener.name.internal.ssl.keystore.location 如果没有配置监听器的名称,配置就使用通用的配置,如ssl.keystore.location
stringPLAINTEXT:PLAINTEXT,
SSL:SSL,
SASL_PLAINTEXT:SASL_PLAINTEXT,
SASL_SSL:SASL_SSL
low

配置虚拟机两个IP地址:

kafka的server.properties的配置:

默认配置:

使用PLAINTEXT://:9092,在所有网络接口发布服务。

zookeeper的信息:

默认配置下,106和116两个IP地址都可以使用:

public class MyProducer {    public static void main(String[] args) throws ExecutionException, InterruptedException {        Map configs = new HashMap<>();//        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.100.106:9092");        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.100.116:9092");        configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);        configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);        KafkaProducer producer = new KafkaProducer(configs);        RecordMetadata metadata = producer.send(                new ProducerRecord("tp_demo_01", "hello lagou 106-1")        ).get();        System.out.println(metadata.topic() + "\t" + metadata.partition() + "\t" + metadata.offset());        producer.close();    }}

如果服务器有两个IP地址,一个是内网,另一个是外网,如何配置,让broker之间通信走内网IP地址,而将外网地址供外网客户端使用?

首先需要配置两个listener:

listeners=PLAINTEXT://192.168.100.106:9092,PLAINTEXT://192.168.100.116:9093advertised.listeners=PLAINTEXT://192.168.100.116:9093

报错:因为listeners中的PLAINTEXT是监听器的名字。

如果两个监听器,它们的名字不能一样,所以改进配置:

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093advertised.listeners=MYCLIENT://192.168.100.116:9093

报错:因为没有给MYCLIENT名字的监听器配置安全协议。

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093advertised.listeners=MYCLIENT://192.168.100.116:9093listener.security.protocol.map=MYCLIENT:PLAINTEXT,PLAINTEXT:PLAINTEXTinter.broker.listener.name=MYCLIENT

zk结果:

此时使用代码访问:

192.168.100.116:9093可以访问,192.168.100.106:9092不能访问。

则192.168.100.116:9093暴露给客户端使用了。

终极配置:

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093advertised.listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093listener.security.protocol.map=MYCLIENT:PLAINTEXT,PLAINTEXT:PLAINTEXTinter.broker.listener.name=PLAINTEXT
  1. 一个服务器上有两个IP地址,一个是内网地址,另一个是外网地址。

  2. advertised.listeners用于指定要发布到zookeeper上供客户端使用的监听器。

  3. 使用listeners让kafka启动的时候,使用指定的协议监听指定的IP地址和端口。

  4. 同时指定broker之间通信使用的监听器名称,该监听器使用内网IP地址。

  5. advertised.listeners中的另一个供客户端使用。

到此,相信大家对"Kafka的面试题有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0