问你为什么选择Kafka,你会怎么回答?

可靠的含义在百度百科的解释是:可以信赖、可以相信、可靠的朋友。那Kafka究竟是不是一个可靠的朋友呢?既然全世界绝大部分高可用系统都有Kafka的支持,Kafka必定有其过人之处,跟着我来分析分析。

另外多提一嘴Kafka在GitHub目前已有star数27.6k、fork数13.6k。

在可靠的人手中,有强人在关照

在可靠的人手中,有强人在关照

本文收录在我开源的《Java学习面试指南》中,一份覆盖Java程序员所需掌握的Java核心知识、面试重点。希望收到大家的 ⭐ Star ⭐支持。GitHub地址:https://github.com/hdgaadd/JavaGetOffer,相信你看了一定不会后悔。

文章目录

    • 1. Kafka高水位
    • 2. Kafka消息可靠性
      • 2.1 消息存储可靠性
      • 2.2 生产者消费者可靠性
      • 2.3 消费堆积问题
    • 3. Kafka控制器

1. Kafka高水位

面试官:知道Kafka高水位吗?

我们都知道Kafka消息保存在首领分区和分区副本中,Kafka要保证即使从分区副本读取消息也只会读取已提交的消息。Kafka的高水位就是为了这个目标而开发出来的。

如果大家对消息已提交的概念不清楚的话,可以看下以下的解释。

Kafka的消息只有在所有分区副本都同步该消息后,才算是已提交的消息

在分区复制的过程中,首领分区会在发送的数据里加入当前高水位。当前高水位就是复制偏移量,记录了当前已提交消息的最大偏移量。而分区副本就可以根据首领分区副本提供的高水位,来避免未提交的消息被消费者消费。

就如下图,最大偏移量的限制就像海面上的水位。

在这里插入图片描述

2. Kafka消息可靠性

2.1 消息存储可靠性

面试官:你说说Kafka是怎么保证消息可靠性的?

大家在回答面试官问题前可以思考下,可靠性的含义是什么?

在业务系统中,消息的不丢失是最重要的,数据即是金钱。如果把客户的一条支付消息丢失,而这条支付信息的涉及的金额不菲,想想对公司的损失有多大。所以可靠性意味着对消息的存储和保护。

Kafka在这方面采用了复制机制和分区多副本架构来作为消息可靠性的核心。

(1)分区多副本架构。

Kafka的所有主题被分为了多个分区存储在多个Broker里,而每个分区可以有多个副本。例如有4个Broker节点,Broker1存储了分区首领副本,而Broker2、Broker3可以存储其分区副本。

Kafka对消息的存储有多个分区副本来支持,可以避免单点问题导致数据丢失找不回来的情况。

(2)复制机制。

在通常情况下消费者都是从首领副本里读取消息,同时会有n(复制系数)个Broker机器会去同步复制首领副本后,生成跟随者副本也就是分区副本。

如果首领副本的机器挂了,分区副本就会选举成为新的首领副本

复制机制保证了分区副本和首领副本的数据一致性,有复制机制的加持,分区多副本架构才是可用的。

2.2 生产者消费者可靠性

面试官:还有呢?

上面所说的其实是基于Broker层面带给Kafka的可靠性保障,我们还需要在生产者、消费者层面下功夫,来使整个系统减少丢失数据的风险。

一、在生产者方面。

Kafka提供了多种发送确认模式,我们可以根据业务的可靠性需求配置合适的acks。

  1. ack = 0。如果消息生产者能够把消息通过网络发送出去,则认为消息已成功写入。
  2. ack = 1。如果首领分区收到消息并成功写入,生产者收到确认返回,则认为消息已成功写入。
  3. ack = all。只有在消息成功写入所有分区副本后,才认为消息已成功写入。这保证了消息的多备份。

以上的各种acks情况如果失败的话,我们可以让生产者继续重试发送消息,直到Kafka返回成功。

二、在消费者方面

大家如果能回答上文第一个面试官问题:知道Kafka高水位吗,就知道Kafka高水位保证了消费者只会读取到已提交的数据,即被写入所有分区副本的数据。所以消费者要确保的是跟踪哪些数据已读取了、哪些数据未读取。

  1. 消费者消费消息时会先获取一批消息,同时从最后一个偏移量开始读取,这保证了消息的顺序性
  2. 消费者消费消息后会同步提交、异步提交偏移量,保证了消息不被其他消费者重复消费

2.3 消费堆积问题

面试官:那要是Kafka消费堆积了你怎么处理?

这个问题是面试官常考的一个问题,我们要从Broker和消费者两方面来看。

一、Broker的话。

  1. 每个topic是分为多个分区给不同Broker进行处理,要合理分配分区数量来提高Broker的消息处理能力。比如3个Broker2个分区,可以改为3个Broker3个分区。
  2. 可以横向扩展Broker集群,来提高Broker的消息处理能力。

二、消费者的话。

  1. 可以增加消费者服务数量来提高消息消费能力。
  2. 在提交偏移量时,可以把同步提交改为异步提交。异步提交无需等待Kafka的确认返回,减少了同步等待Broker的时间。

3. Kafka控制器

面试官:知道Kafka控制器吧?

Kafka控制器其实也是一个Broker,不过它还负责选举分区首领。Kafka的控制器和Redis集群的哨兵的选举功能是一样的。

也就是在首领副本所在的分区失效后,Kafka会通过控制器来在分区副本里选举出新的首领副本

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六西格玛培训,带你解锁职场超能力工具!

当提及六西格玛培训的精髓时,我们不得不提到那些强大而实用的工具,它们如同探险者的指南针,引导我们走向卓越。今天,就让我们一起揭开这些神秘工具的面纱,探寻六西格玛背后的智慧。 首先,DMAIC流程是六西格…

python小游戏:猜数字、猜动物、单词接龙(带界面)

正在学习python的各位童鞋,可以多多找些程序来练练手,从而更快的掌握python编程。这里就为大家找了三个示例小程序:猜数字、猜动物、单词接龙。 一、猜数字 程序会随机生成一个1到100之间的数字,然后让用户尝试猜测这个数字。用户…

cesium 漫游

token记得换成您自己的&#xff01;&#xff01;&#xff01; 申请cesium的token 官网【Cesium: The Platform for 3D Geospatial】 <template><div id"cesiumContatiner"><!-- <div id"mapContainer1"></div> --></di…

如何理解敏捷开发和瀑布模型的区别

敏捷开发和瀑布模型是两种不同的软件开发方法&#xff0c;它们在多个方面存在显著的差异。以下是它们之间的主要区别&#xff1a; 开发流程&#xff1a; 瀑布模型&#xff1a;采用线性的开发流程&#xff0c;按照预先规划的顺序依次进行需求分析、设计、编码、测试和维护等环节…

【蒙特卡洛仿真的corner】

蒙特卡洛仿真的corner global variation指的是不同晶圆之间的process的差别 local variation指的是同一个晶圆内的不同管子之间的mismatch smic40ll工艺中&#xff0c;ttg&#xff0c;ssg&#xff0c;sfg&#xff0c;fsg corner只包含mismatch ss&#xff0c;tt&#xff0c;sf&…

员工离职删除自己做的文件违法么?如何杜绝这种现象?

员工离职时删除自己做的文件是否违法&#xff0c;需要视情况而定&#xff1a; 如果删除的是个人自己的文件&#xff1a; 在这种情况下&#xff0c;员工删除的是自己制作的、不涉及公司机密或经营数据的个人文件&#xff0c;通常不会被视为违法行为。 如果删除的是公司的文件…

探索 CSV 模块:Python 中 CSV 数据持久化的最佳实践

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本章节介绍使用 CSV 文件来存储数据&#xff0c;CSV 文件是一种常见的数据格式&#xff0c;可以用来存储和交换表格数据。CSV 文件由一系列的行组成&#x…

SQL Developer管理RESTful 服务

RESTful 服务依赖于ORDS&#xff08;Oracle REST Data Services&#xff09;&#xff0c;所以在进行本实验前&#xff0c;请先确认数据库服务器上的ORDS服务已启动&#xff1a; $ systemctl status ords ● ords.service - Oracle REST Data ServicesLoaded: loaded (/etc/sys…

小程序canvas的同层渲染 这个属性不加,就不会生效!

做微信小程序的时候&#xff0c;发现vant-weapp的图表相关的vant再实机上怎么用都有问题&#xff08;同层渲染失败&#xff09;。 看了官方文档结果说了半天一点用都没有&#xff0c;官方原话是&#xff1a;当前所有原生组件&#xff08;除 input 组件 focus 状态&#xff09;均…

scripts/Makefile.host 分析【fixdep、conf】

文章目录 1. 目标 $(obj)/fixdep1.1 cmd_host-csingle函数分析&#xff1a; 2. 目标 $(obj)/conf2.1 cmd_host-cmulti函数分析&#xff1a;2.2 生成 $(obj)/conf.o 文件&#xff1a;2.3 生成 $(obj)/zconf.tab.o 文件&#xff1a; 1 # SPDX-License-Identifier: GPL-2.0 2 …

C++二级指针的指向与解引用

本文算是作者对于二级指针学习的一些总结或者说是刨根问底&#xff0c;如果有表述错误&#xff0c;还请各位大神指正。 我们首先定义一个整型a&#xff0c;令a 5&#xff0c;再分别定义指针p和二级指针ptr int a 5; int *p &a; int **ptr &p;我们不妨假设a的地址是…

云原生周刊:Gateway API v1.1 发布 | 2024.6.3

开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活、可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种替代方案。 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件&#xff0c;可以轻松地将一个 Kubernetes PersistentVo…

23中设计模式之一— — — —命令模式的详细介绍

命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式&#xff08;别名&#xff1a;动作&#xff0c;事务&#xff09; 命令模式是一种行为设计模式&#xff0c;将一个请求封装为一个对象…

【qt】项目移植

项目移植 一.前言二.同名问题三.具体操作1.修改文件名2.修改类名3.修改一些不能自动改的名4.修改.ui文件5.删除原来自动生成的ui_xxx.h文件6.修改头文件 四.导入项目五.使用导入的项目六.项目建议 一.前言 终于概率论考完了,有时间了,接着上个项目,我们继续来完成我们的多窗口开…

【Leetcode Python】

偷某间房屋时&#xff0c;累积金额等于间隔前两间房的金额加上当前房的金额数&#xff1b;不偷时&#xff0c;累计金额就等于前一间房的金额数。 状态转移方程&#xff1a;dp[i] max(dp[i-2]nums[i], dp[i-1]) 并且注意错误点&#xff1a;dp[1]有两间房时&#xff0c;初始值为…

汽车soa架构介绍

SOA 架构的基本概念 面向服务的架构(Service-Oriented Architecture,简称 SOA)是一种软件设计和架构风格,近年来在软件开发领域得到了广泛的关注和应用。 SOA 的定义可以概括为:它是一种将应用程序分解为一组松散耦合的服务的架构模式。这些服务通过定义明确的接口进行通…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…

jmeter并发测试

目录 常用的压测工具jmeter安装配置并执行新建测试计划 Test Plan添加线程组练习01&#xff1a;共10个线程&#xff0c;每秒钟启动一个线程&#xff08;需要10秒&#xff09;&#xff0c;每个线程发送两个请求练习02&#xff1a;共10个线程&#xff0c;1秒中内启动完毕&#xf…

03-3.2.2 队列的顺序存储实现

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

kali中安装、卸载程序教程

1、安装教程 ①、使用apt安装 apt update &#xff08;先更新apt&#xff09; apt-get install xxxx(xxx为需要安装的软件名)②、使用dpkg安装 dpkg –i deb的软件包名&#xff08;需要在软件包的目录下使用&#xff0c;不然就要把地址加上&#xff09;二、卸载教程 ①、使…