当前位置: 首页 > 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 属性就可以了...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...