微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kafka的面试题有哪些

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

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

答:区别:

按照范围来分配:

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

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

基于主题的;

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

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

Kafka的面试题有哪些

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

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

Kafka的面试题有哪些

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

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

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

Kafka的面试题有哪些

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

Kafka的面试题有哪些

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

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

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

Sender线程:

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

Kafka的面试题有哪些

run方法的实现:

Kafka的面试题有哪些

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

Kafka的面试题有哪些

sendProducerData的实现:

Kafka的面试题有哪些

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

Kafka的面试题有哪些

Kafka的面试题有哪些

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

Kafka的面试题有哪些

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

Kafka的面试题有哪些

callback的handleProduceResponse方法实现:

Kafka的面试题有哪些

completeBatch方法实现:

Kafka的面试题有哪些

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

Kafka的面试题有哪些

上图中的canRetry实现:

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

Kafka的面试题有哪些

将消息批重新入列:

Kafka的面试题有哪些

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

Kafka的面试题有哪些

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

Kafka的面试题有哪些

)

failBatch的实现:

Kafka的面试题有哪些

上图中调用方法

Kafka的面试题有哪些

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

Kafka的面试题有哪些

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

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

Kafka的面试题有哪些

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

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

配置虚拟机两个IP地址:

Kafka的面试题有哪些

kafka的server.properties的配置:

认配置:

Kafka的面试题有哪些

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

zookeeper的信息:

Kafka的面试题有哪些

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

public class MyProducer {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Map<String, Object> 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<String, String> producer = new KafkaProducer<String, String>(configs);

        RecordMetadata Metadata = producer.send(
                new ProducerRecord<String, String>("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:9093
advertised.listeners=PLAINTEXT://192.168.100.116:9093

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

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

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

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

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

zk结果:

Kafka的面试题有哪些

此时使用代码访问:

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:9093
advertised.listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093
listener.security.protocol.map=MYCLIENT:PLAINTEXT,PLAINTEXT:PLAINTEXT
inter.broker.listener.name=PLAINTEXT
  1. 一个服务器上有两个IP地址,一个是内网地址,另一个是外网地址。

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐