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.消息积压问题--高可用
- 如果业务正常,只是因为消费者消费太慢,则增加partition数量,增加消费者数量即可。
- 发送消息时,尽量保证消息在各个Partition分布均匀;
- 如果业务异常,则降级处理,人工介入分析该问题。
相关文章:
Kafka的三高设计原理
1.生产者缓存机制--高性能 生产者缓存机制的主要目的是将消息打包,减少网络IO频率 kafka生产者端存在消息累加器RecordAccumulator,它会对每个Partition维护一个双端队列,队列中消息到达一定数量后 或者 到达一定时间后,通过sen…...
生信圆桌x生信宝库:生物信息学资源与工具的终极指南
介绍 生物信息学作为现代生物科学的重要分支,涉及到大量的数据处理、分析和存储工作。随着领域的不断发展,各类生物信息学资源与工具也如雨后春笋般涌现。这些资源涵盖了从基因组数据、蛋白质结构到代谢路径的方方面面,极大地丰富了科研人员的…...
centos7 install rocketmq 宿主机快速搭建RocketMQ单机开发环境_centos7 单机部署rocketmq命令
2214 Jps 2071 BrokerStartup 1947 NamesrvStartup ### 第四步:发送消息测试消费着启动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 螺线运动的基本几何模型 板凳龙的舞动路径为等距螺线。螺线是极坐标中一类常见曲线,其特点是半径随角度线性增加。我们可以用以下极坐标方程描述这条螺线: r ( θ ) p 2 π θ r(\theta) \frac{p}{2\pi} \theta r(θ)2πpθ 其…...
What is Approximation Ratio?
Approximation Ratio 近似比率是用来衡量一个算法找到的近似解与最优解之间的差距的一个量化指标. 假设有一个优化问题,其最优解的值是OPT,用时间T,而我们的算法得到的解的值是ALG,用时间t。如果算法有一个2的近似比率,那么我们…...
探索Unity与C#的无限潜能:从新手到高手的编程之旅
在数字创意与技术创新交织的今天,Unity游戏引擎凭借其强大的跨平台能力和灵活的编程接口,成为了无数开发者心中的首选。而C#,作为Unity的官方脚本语言,更是以其面向对象的特性和丰富的库支持,为游戏开发注入了无限可能…...
初始MYSQL数据库(2)——创建、查询、更新、删除数据表的相关操作
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 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…...
多线程篇(并发相关类- 原子操作类)(持续更新迭代)
目录 前言 一、原子变量操作类(AtomicLong为例) 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用…...
数学建模常用工具总结
数学建模常用工具总结 绘图篇pythonMATLABLIVEGAP CHARTSApache EChartsBioLadderHiplot Pro 生物医学可视化平台Graph EditorRAWGraphs 2.0ExcalidrawPPT绘图 配色篇Color SpaceAdobe Color 素材篇手绘素材插画网iconfont-阿里巴巴矢量图标库下面四个都是实物风格的素材&#…...
【Redis】为什么选择 Redis 做缓存?
近期文章: 【Redis】Redis 底层的数据结构(结合源码) 【MySQL】索引底层的数据结构 BTree 在系统开发中,我们经常会使用 Redis 作为缓存系统,但你知道为什么要使用缓存吗?为什么是使用 Redis 作为缓存呢&…...
Flutter 开发常用第三方库总结
Flutter 开发常用第三方库总结 常用库 常用库 屏幕适配flutter_screenutil加载 svg flutter_svg状态管理 flutter_bloc(bloc、equatable)、provider视频播放器chewie图片缓存cached_network_image网络请求 dio设备信息查询device_info_plus文件路径 pat…...
OpenCV中的颜色映射函数applyColorMap的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV 中应用类似于 GNU Octave 或 MATLAB 中的颜色映射,虽然 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语言的初学者,特别是java开发者新学习go语言,对于一些和java类似但是又有差异的概念很容易混淆,比如说go中的零值,nil 和 空结构体。本文就来详细探讨一下go中这些特殊概念的含义和实际场景中的应用: 零值 零值&…...
Node.js sqlite3:Statement对象详解
在Node.js的sqlite3库中,Statement对象是一个非常重要的概念。它代表了一个预编译的SQL语句,可以多次执行以提高性能。通过使用Statement对象,你可以避免重复解析和编译SQL语句的开销,特别是在需要频繁执行相同SQL语句的情况下。本…...
ELK学习笔记——如何给Kibana新增用户和角色
Kibana新增用户和角色 首先用超管账号登录上Kibana,按照下面步骤操作 1、创建角色 按图操作 2、创建用户 按图操作 3、给用户分配角色 至此,角色和用户绑定成功; 最后,可以退出管理员账号,登录这个新…...
Minikube Install Kubernetes v1.18.1
文章目录 简介安装工具配置代理运行集群检查集群加入rancher 简介 模拟客户环境,测试 kubernetes v1.18.x 是否可以被 rancher v2.9.1 纳管。 安装工具 docker 安装Install and Set Up kubectl on Linux 安装 minikube 配置代理 docker proxylinux proxy 运行…...
重修设计模式-创建型-工厂模式
重修设计模式-创建型-工厂模式 一、概述 工厂模式(Factory Pattern)是设计模式中非常基础且常用的一种模式,主要目的是通过封装对象的创建过程,从而实现代码的解耦和灵活性的提升。 工厂模式的核心思想 封装对象的创建&#x…...
使用Cskin时候 遇到按钮有默认阴影问题解决
使用Cskin时候 遇到按钮有默认阴影 设置 DrawType 属性就可以了...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
