当前位置: 首页 > news >正文

Kafka的三高设计原理

1.生产者缓存机制--高性能

生产者缓存机制的主要目的是将消息打包,减少网络IO频率

kafka生产者端存在消息累加器RecordAccumulator,它会对每个Partition维护一个双端队列,队列中消息到达一定数量后 或者 到达一定时间后,通过sender线程批量的将消息发送给kafka服务端。(批量发送)

2.发送应答机制--高可用

发送应发机制保证了消息可以安全到达服务端

Producer端一个不太起眼的属性ACKS_CONFIG:

  • acks = 0,生产者不关心broker的应答;不安全,但是速度快
  • acks = all or -1,生产者需要所有partition的应答;最安全,但是效率低一些
  • acks = 1,生产者只需要Leader partition的应答;中和

3.生产者消息幂等性--高可用

防止消息重复发送到服务端Broker

(解决了单分区发送的问题)

每个Producer发送消息到Broker的时候,会携带<PID,SN>给Broker,PID是该Producer的唯一标识,SN是消息序号。Broker端会维护这个SN的序列号。如果发送端SN<=服务端SN,则重复应答即可;如果发送端SN>服务端SN,则说明发送的消息有丢失!如果发送端SN=服务端SN+1,则正常接收消息。

(多分区发送的幂等性问题需要事务机制来保证)

4.Controller Broker和Leader Partition--高可用

监控作用

基于Zookeeper的Controller选举机制,Controller Broker管理所有Broker的健康状态;

Leader Partition管理该Topic下的所有partition;

当一个broker中存在多个Leader partition的时候,会触发Leader partition的自平衡机制,涉及到大量消息的转移和同步。

5.Partition的故障恢复机制--高可用

保证各partition的数据一致性

  • LEO(Log End Offset): 每个Partition的最后一个Offset
  • HW(High Watermark): 一组Partiton中最小的LEO

当follower partition故障时,该Follower节点会读取本地记录的上一次的HW,将自己的日志中高于HW的部分信息全部删除掉,然后从HW开始,向Leader进行消息同步。

当Leader partition故障时,会选举出新的Leader partition,其他Follower会将各自的Log文件中高于HW的部分全部清理掉,然后从新的Leader中同步数据。

如果follower partition的HW不一致,那kafka通过epoch机制来进行数据同步。

(每个Leader Partition在上任之初,都会新增一个新的Epoch记录。这个记录包含更新后的epoch版本号,以及当前Leader Partition写入的第一个消息的偏移量。接下来其他Follower Partition要更新数据时,就可以不再依靠自己记录的HW值判断拉取消息的起点,而是根据这个最新的epoch条目来同步

6.消息存储--高性能

三个日志文件存储kafka的消息,.log存储实际消息,.index以偏移量为索引,.timeindex以时间戳为索引

.log只可以进行消息顺序写的追加,不支持修改和删除!顺序写的效率很高

.index类似于跳表!<offset,pos>,跳表的查询效率高,redis也用到跳表!

7.零拷贝--高性能

producer发送给broker的消息通过mmap持久化到磁盘;

consumer通过sendfile方式拉取broker的消息;

8.消费者防止消息重新消费--高性能

1)消费者通过订单的id去查看该消息是否已被消费过(消息如果被消费了,则该id已存在)

2)通过redis维持offset,消费时将消息的offset与redis中的offset进行比较

9.kafka消息零丢失方案--高可用

  • 生产者发送消息到broker不丢失:acks = -1或者all;或者1。
  • broker保证消息不丢失:1)配置多备份因子;2)合理刷盘频率
  • 消费者防止异步处理丢失消息:手动提交offset更安全一些

10.消息积压问题--高可用

  1. 如果业务正常,只是因为消费者消费太慢,则增加partition数量,增加消费者数量即可。
  2. 发送消息时,尽量保证消息在各个Partition分布均匀;
  3. 如果业务异常,则降级处理,人工介入分析该问题。

相关文章:

Kafka的三高设计原理

1.生产者缓存机制--高性能 生产者缓存机制的主要目的是将消息打包&#xff0c;减少网络IO频率 kafka生产者端存在消息累加器RecordAccumulator&#xff0c;它会对每个Partition维护一个双端队列&#xff0c;队列中消息到达一定数量后 或者 到达一定时间后&#xff0c;通过sen…...

生信圆桌x生信宝库:生物信息学资源与工具的终极指南

介绍 生物信息学作为现代生物科学的重要分支&#xff0c;涉及到大量的数据处理、分析和存储工作。随着领域的不断发展&#xff0c;各类生物信息学资源与工具也如雨后春笋般涌现。这些资源涵盖了从基因组数据、蛋白质结构到代谢路径的方方面面&#xff0c;极大地丰富了科研人员的…...

centos7 install rocketmq 宿主机快速搭建RocketMQ单机开发环境_centos7 单机部署rocketmq命令

2214 Jps 2071 BrokerStartup 1947 NamesrvStartup ### 第四步&#xff1a;发送消息测试消费着启动export NAMESRV_ADDRlocalhost:9876 ./tools.sh org.apache.rocketmq.example.quickstart.Consumer 发送测试消息export NAMESRV_ADDRlocalhost:9876 ./tools.sh org.apache.roc…...

2024高教社杯全国大学生数学建模竞赛(A题)深度剖析 _ 建模完整过程+详细思路+代码全解析

问题1解答过程 1.1 螺线运动的基本几何模型 板凳龙的舞动路径为等距螺线。螺线是极坐标中一类常见曲线&#xff0c;其特点是半径随角度线性增加。我们可以用以下极坐标方程描述这条螺线&#xff1a; r ( θ ) p 2 π θ r(\theta) \frac{p}{2\pi} \theta r(θ)2πp​θ 其…...

What is Approximation Ratio?

Approximation Ratio 近似比率是用来衡量一个算法找到的近似解与最优解之间的差距的一个量化指标. 假设有一个优化问题&#xff0c;其最优解的值是OPT&#xff0c;用时间T&#xff0c;而我们的算法得到的解的值是ALG,用时间t。如果算法有一个2的近似比率&#xff0c;那么我们…...

探索Unity与C#的无限潜能:从新手到高手的编程之旅

在数字创意与技术创新交织的今天&#xff0c;Unity游戏引擎凭借其强大的跨平台能力和灵活的编程接口&#xff0c;成为了无数开发者心中的首选。而C#&#xff0c;作为Unity的官方脚本语言&#xff0c;更是以其面向对象的特性和丰富的库支持&#xff0c;为游戏开发注入了无限可能…...

初始MYSQL数据库(2)——创建、查询、更新、删除数据表的相关操作

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 前面我们学习了创建、删除数据库以及创建、查看、删除数据表的相关操作。 我们知道数据库中所存储的数据其实就是数据表中一条一条的记…...

OpenCV直方图计算

#include <opencv2/opencv.hpp> #include <vector>using namespace cv; using namespace std;int main() {cout << "直方图calcHist" << endl;Mat src imread("left.png", IMREAD_GRAYSCALE);if (src.empty()){cout << &qu…...

多线程篇(并发相关类- 原子操作类)(持续更新迭代)

目录 前言 一、原子变量操作类&#xff08;AtomicLong为例&#xff09; 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类&#xff0c;这些类都是使用非阻塞算法CAS实现的&#xff0c;相比使用…...

数学建模常用工具总结

数学建模常用工具总结 绘图篇pythonMATLABLIVEGAP CHARTSApache EChartsBioLadderHiplot Pro 生物医学可视化平台Graph EditorRAWGraphs 2.0ExcalidrawPPT绘图 配色篇Color SpaceAdobe Color 素材篇手绘素材插画网iconfont-阿里巴巴矢量图标库下面四个都是实物风格的素材&#…...

【Redis】为什么选择 Redis 做缓存?

近期文章&#xff1a; 【Redis】Redis 底层的数据结构&#xff08;结合源码&#xff09; 【MySQL】索引底层的数据结构 BTree 在系统开发中&#xff0c;我们经常会使用 Redis 作为缓存系统&#xff0c;但你知道为什么要使用缓存吗&#xff1f;为什么是使用 Redis 作为缓存呢&…...

Flutter 开发常用第三方库总结

Flutter 开发常用第三方库总结 常用库 常用库 屏幕适配flutter_screenutil加载 svg flutter_svg状态管理 flutter_bloc&#xff08;bloc、equatable&#xff09;、provider视频播放器chewie图片缓存cached_network_image网络请求 dio设备信息查询device_info_plus文件路径 pat…...

OpenCV中的颜色映射函数applyColorMap的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 中应用类似于 GNU Octave 或 MATLAB 中的颜色映射&#xff0c;虽然 OpenCV 中的颜色映射类型与 GNU Octave 或 MATLAB 中的颜色映射类型名…...

Ubuntu22.04安装colmap

首先上这里查看自己电脑GPU的CMAKE_CUDA_ARCHITECTURES 终端输入以下内容安装预先的前置依赖 sudo apt-get install \git cmake ninja-build build-essential \libboost-program-options-dev libboost-filesystem-dev \libboost-graph-dev libboost-system-dev libboost-tes…...

认识GO语言中的nil,零值与空结构体

go语言的初学者&#xff0c;特别是java开发者新学习go语言&#xff0c;对于一些和java类似但是又有差异的概念很容易混淆&#xff0c;比如说go中的零值&#xff0c;nil 和 空结构体。本文就来详细探讨一下go中这些特殊概念的含义和实际场景中的应用&#xff1a; 零值 零值&…...

Node.js sqlite3:Statement对象详解

在Node.js的sqlite3库中&#xff0c;Statement对象是一个非常重要的概念。它代表了一个预编译的SQL语句&#xff0c;可以多次执行以提高性能。通过使用Statement对象&#xff0c;你可以避免重复解析和编译SQL语句的开销&#xff0c;特别是在需要频繁执行相同SQL语句的情况下。本…...

ELK学习笔记——如何给Kibana新增用户和角色

Kibana新增用户和角色 首先用超管账号登录上Kibana&#xff0c;按照下面步骤操作 1、创建角色 按图操作 2、创建用户 按图操作 3、给用户分配角色 至此&#xff0c;角色和用户绑定成功&#xff1b; 最后&#xff0c;可以退出管理员账号&#xff0c;登录这个新…...

Minikube Install Kubernetes v1.18.1

文章目录 简介安装工具配置代理运行集群检查集群加入rancher 简介 模拟客户环境&#xff0c;测试 kubernetes v1.18.x 是否可以被 rancher v2.9.1 纳管。 安装工具 docker 安装Install and Set Up kubectl on Linux 安装 minikube 配置代理 docker proxylinux proxy 运行…...

重修设计模式-创建型-工厂模式

重修设计模式-创建型-工厂模式 一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是设计模式中非常基础且常用的一种模式&#xff0c;主要目的是通过封装对象的创建过程&#xff0c;从而实现代码的解耦和灵活性的提升。 工厂模式的核心思想 封装对象的创建&#x…...

使用Cskin时候 遇到按钮有默认阴影问题解决

使用Cskin时候 遇到按钮有默认阴影 设置 DrawType 属性就可以了...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...