kafka常见面试题总结

news/2024/11/14 9:02:53/

Kafka 核心知识解析

一、Kafka 消息发送流程

Kafka 发送消息涉及两个线程:main 线程和 sender 线程。在 main 线程中,会创建一个双端队列 RecordAccumulator,main 线程负责将消息发送给 RecordAccumulator,而 sender 线程则从 RecordAccumulator 中拉取消息并发送到 Kafka Broker。

二、Kafka 分区的目的

  1. 合理使用存储资源与负载均衡
    分区会分布在不同 broker 上,通过将海量数据分区存储在各个 broker,可以实现负载均衡的效果,以此达到合理使用存储资源的目的。
  2. 提高并行度
    生产者能够以分区为单位发送消息,消费者也以分区为单位消费数据,这样大大提高了并行度。

三、Kafka 消息的有序性保障

  1. 生产者端
    最简单的方式是设置一个分区,因为 Kafka 在同一个分区内传递消息是有序的。或者可以选择同步式发送模式,不过这种模式效率较低。
  2. 消费者端
    可以设置单个消费者单个分区,以此确保消息的有序性。

四、ISR、OSR、AR 概念

ISR 是 Kafka 集群中还存活的副本,OSR 是在规定时间内没有做出响应被认为已经挂掉的副本,AR 包含 ISR 和 OSR。

五、Kafka 消息丢失情况及应对

  1. 生产者端消息丢失
    如果 acks 设置不当很可能导致消息丢失,acks 有三种配置级别,最高级别是 -1 或者 all,在此级别下生产者会等待整个集群回应接收到消息才认为消息发送成功,安全性更高。不过,由于网络或服务状态问题也可能导致发送消息出现问题,解决此问题可能会涉及到事务。
  2. 消费者端消息丢失
    这和偏移量有很大关系,不合理的偏移量提交一般会导致消息丢失。

六、保证 Kafka 可靠性的方法

  1. 生产者端
    考虑将 acks 参数调为 -1 或者 all,设置调优重试机制,启动幂等性(保证同消息只持久化一次),使用开启事务来提交生产者消息并使用同步提交方式(send(record).get())。
  2. 消费者端
    可以选择手动控制偏移量的提交,这样能避免依赖自动提交时因故障导致的错误偏移量。

七、Kafka 数据去重

Kafka 0.11 版本以后出现了幂等性和事务两个特性来保证数据去重。幂等性通过 PID、Partition、SeqNumber 判断消息是否重复,重复的数据 broker 只会持久化一条。通过事务提交,可以在事务完整提交前对消费者隐藏消息,只有全部事务完整完成消费者才会消费消息,类似于 Java、mysql 等的事务。

八、生产者提高吞吐量的方法

可以调大批次大小参数 batch.size、调整等待时间 linger.ms 参数、设置压缩格式 compression.type 参数压缩数据、调增缓冲区大小 RecordAccumulator。

九、Zookeeper 在 Kafka 集群中的作用

Zookeeper 相当于 Kafka 集群的一个代理,Kafka 的每个 broker 会在 Zookeeper 中进行注册,并保存一些元数据信息,比如主题创建的分区副本等信息。Zookeeper 还会对 Kafka 集群进行 leader 的选举,当某个 leader 出现故障,Zookeeper 会根据选举机制选举新的 leader,同时还能起到负载均衡的效果。总的来说,Zookeeper 协助 Kafka 实现高可用。

十、Kafka 集群中的 Leader 选举机制

当一个分区的 leader 出现故障时,集群会给分区选举新的 leader 以保证该分区的正常运行。选举会根据 Replicas 的顺序,并对照 Isr 来跳过实际不存活的节点。

十一、Kafka 处理数据乱序问题的方法

Kafka 消息传递过程中每个分区的消息是有序的,但存在多个分区时,由于每个分区传递数据的顺序不同会导致数据乱序问题。解决数据乱序问题需要只设置一个分区,并且开启幂等性,acks 设置为 all 或者 -1。

十二、Kafka 中节点的服役和退役

  1. 服役
    首先准备一台配置好环境的服务器,然后写一个需要服役的主题的 json 文件并为之生成负载均衡计划,将计划储存在 json 文件中,使用 kafka - reassign - partitions.sh 命令执行计划,最后查看主题详情确认是否服役成功。
  2. 退役
    和服役操作相仿,重新生成执行计划并执行即可。

十三、Kafka 中 Leader 和 Follower 故障重启后的数据同步

  1. Follower 挂了再启动
    如果是 follower 挂了不影响其他的副本,当 follower 再次启动时,会根据它挂掉时的分区内最小的偏移量 offset 值的后一位从 leader 中同步。
  2. Leader 挂了
    如果 leader 挂了,此时需要重新选举 leader,其他 follower 会从此时分区内偏移量最小的后一个位置重新从新的 leader 中同步数据。

十四、打破 Kafka 初始化时 Leader 选举规律的方法

这种情况一般很少出现,大概率是因为某个任务量巨大,而集群里服务器配置不同,有的服务器性能比较低。此时需要手动设置副本存储计划,指定 replicas 都在哪些节点里执行创建的计划。


http://www.ppmy.cn/news/1546603.html

相关文章

【HAProxy05】企业级反向代理HAProxy调度算法之静态算法与动态算法

HAProxy 调度算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法,该参数可以配置在listen或backend选 项中。 HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据不同的参数实现静态和动态算法 相互转换。 官方文档&#xff1…

实现高效数据同步:从金蝶云星空到旺店通

盘亏单对接其他出库单:金蝶云星空到旺店通企业奇门的数据集成方案 在现代企业的运营过程中,数据的高效流动和准确对接是确保业务顺畅运行的关键。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将金蝶云星空中的…

使用 Python 实现高效网页爬虫——从获取链接到数据保存

前言 在这个时代,网络爬虫已成为数据分析与信息收集不可或缺的技术之一。本文将通过一个具体的Python项目来介绍如何构建一个简单的网络爬虫,它能够自动抓取指定网站的文章链接、标题、正文内容以及图片链接,并将这些信息保存为CSV文件。 目标网站 一、准备工作 在开始编…

1.1 关于游戏编程

1.1.1、游戏中客户端和服务器的交互 游戏通常采用客户端-服务器模式‌。在这种模式下,服务器负责处理游戏的核心逻辑、数据存储和玩家间的交互,而客户端则负责呈现游戏画面、接收玩家输入并与服务器通信‌。 客户端和服务器的作用和功能 ‌客户端‌&a…

DevExpress JS ASP.NET Core v24.1亮点 - 支持DateOnly/TimeOnly类型

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

mapreduce 将数据清洗后保存到 hbase

mapreduce 将数据清洗后保存到 hbase 数据格式 {"年份":"1990","国家补贴(亿元)":"5.4","地方补贴(亿元)":"3.2","企业补贴(亿元)&qu…

基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统

基于SSM(Spring Spring MVC MyBatis)框架的汽车租赁共享平台系统是一个复杂的Web应用程序,用于管理和调度汽车租赁服务。下面我将提供一个详细的案例程序概述,包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理&…

CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试

在Windows操作系统中,Process Environment Block (PEB,进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中 如何获取PEB指针? 在Windows操作系统中,获取PEB指针的常见方法主要有以下几种。: 1. 使…