Kafka保证百万级数据写入和重发问题分享

news2025/2/23 18:44:52

Kafka作为当下流行的高并发消息中间件,大量用于数据采集,实时处理等场景,
那么它如何做到百万级写入速度呢?我们在享受它带来的高并发,高可靠等便利时,同时不得不面对可能存在的问题,项目中最常见的就是丢包,重发问题,这些问题在项目中又如何解决呢?下面让我们一点点揭开。

一、如何保证百万级写入速度

1、页缓存技术 + 磁盘顺序写

首先Kafka每次接收到数据都会往磁盘上去写,如下图所示。
那么在这里我们不禁有一个疑问了,如果把数据基于磁盘来存储,频繁的往磁盘文件里写数据,这个性能会不会很差?大家肯定都觉得磁盘写性能是极差的。
在这里插入图片描述

没错,要是真的跟上面那个图那么简单的话,那确实这个性能是比较差的。

  • 但是实际上Kafka在这里有极为优秀和出色的设计,就是为了保证数据写入性能,首先Kafka是基于操作系统的页缓存来实现文件写入的。
    操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为os cache,意思就是操作系统自己管理的缓存
    你在写入磁盘文件的时候,可以直接写入这个os cache里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把os cache里的数据真的刷入磁盘文件中。
    仅仅这一个步骤,就可以将磁盘文件写性能提升很多了,因为其实这里相当于是在写内存,不是在写磁盘,大家看下图。

在这里插入图片描述

  • 接着另外一个就是kafka写数据的时候,非常关键的一点,他是以磁盘顺序写的方式来写的。也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。
    普通的机械磁盘如果你要是随机写的话,确实性能极差,也就是随便找到文件的某个位置来写数据。
    但是如果你是追加文件末尾按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上可以跟写内存的性能本身也是差不多的。
    所以大家就知道了,上面那个图里,Kafka在写数据的时候,一方面基于了os层面的page cache来写数据,所以性能很高,本质就是在写内存罢了
    另外一个,他是采用磁盘顺序写的方式,所以即使数据刷入磁盘的时候,性能也是极高的,也跟写内存是差不多的。基于上面两点,kafka就实现了写入数据的超高性能。
    那么大家想想,假如说kafka写入一条数据要耗费1毫秒的时间,那么是不是每秒就是可以写入1000条数据?
    但是假如kafka的性能极高,写入一条数据仅仅耗费0.01毫秒呢?那么每秒是不是就可以写入10万条数?
    所以要保证每秒写入几万甚至几十万条数据的核心点,就是尽最大可能提升每条数据写入的性能,这样就可以在单位时间内写入更多的数据量,提升吞吐量。

2、零拷贝技术

说完了写入这块,再来谈谈消费这块。
大家应该都知道,从Kafka里我们经常要消费数据,那么消费的时候实际上就是要从kafka的磁盘文件里读取某条数据然后发送给下游的消费者,如下图所示。
那么这里如果频繁的从磁盘读数据然后发给消费者,性能瓶颈在哪里呢
在这里插入图片描述
假设要是kafka什么优化都不做
假设要是kafka什么优化都不做,就是很简单的从磁盘读数据发送给下游的消费者,那么大概过程如下所示:

  1. 先看看要读的数据在不在os cache里,如果不在的话就从磁盘文件里读取数据后放入os cache。
  2. 接着从操作系统的os cache里拷贝数据到应用程序进程的缓存里
  3. 再从应用程序进程的缓存里拷贝数据到操作系统层面的Socket缓存里,
  4. 最后从Socket缓存里提取数据后发送到网卡,最后发送出去给下游消费。
    整个过程,如下图所示:

在这里插入图片描述

大家看上图,很明显可以看到有两次没必要的拷贝吧!
一次是从操作系统的cache里拷贝到应用进程的缓存里,接着又从应用程序缓存里拷贝回操作系统的Socket缓存里。而且为了进行这两次拷贝,中间还发生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。所以这种方式来读取数据是比较消耗性能的。

Kafka为了解决这个问题,在读数据的时候是引入零拷贝技术。
也就是说,直接让操作系统的cache中的数据发送到网卡后传输给下游的消费者,中间跳过了两次拷贝数据的步骤,Socket缓存中仅仅会拷贝一个描述符过去,不会拷贝数据到Socket缓存
大家看下图,体会一下这个精妙的过程:
在这里插入图片描述

通过零拷贝技术,就不需要把os cache里的数据拷贝到应用缓存,再从应用缓存拷贝到Socket缓存了,两次拷贝都省略了,所以叫做零拷贝

Socket缓存仅仅就是拷贝数据的描述符过去,然后数据就直接从os cache中发送到网卡上去了,这个过程大大的提升了数据消费时读取文件数据的性能。
而且大家会注意到,在从磁盘读数据的时候,会先看看os cache内存中是否有,如果有的话,其实读数据都是直接读内存的。

如果kafka集群经过良好的调优,大家会发现大量的数据都是直接写入os cache中,然后读数据的时候也是从os cache中读。
相当于是Kafka完全基于内存提供数据的写和读了,所以这个整体性能会极其的高。
说个题外话,下回有机会给大家说一下Elasticsearch的架构原理,其实ES底层也是大量基于os cache实现了海量数据的高性能检索的,跟Kafka原理类似。
因此kafka底层的页缓存技术的使用,磁盘顺序写的思路,以及零拷贝技术的运用,做到每秒几十万的吞吐量。

二、项目中丢包和重发问题解决

1. 丢包问题

1.1 问题描述

所谓丢包一般是指发送方发送的数据未到达接收方. 常见的丢包可能发生在发送端, 网络,接收端.例如,消息推送服务,每天早上,手机上各终端都会给用户推送消息,这时候流量剧增,可能会出现kafka发送数据过快,导致服务器网卡爆满,或者磁盘处于繁忙状态,可能会出现丢包现象。

1.2 问题解决

解决方案:

  1. 对kafka进行限速,平滑流量
  2. 启用重试机制,重试间隔时间设置长一些
  3. Kafka设置acks=all,即需要相应的所有处于ISR的分区都确认收到该消息后,才算发送成功。
    检测方法:使用重放机制,查看问题所在。

2.重发问题

2.1 问题描述

重发问题:当消费者重新分配partition的时候,可能出现从头开始消费的情况,导致重发问题。当消费者消费的速度很慢的时候,可能在一个session周期内还未完成,导致心跳机制检测报告出问题。

问题场景:
  1. 设置offset为自动提交,正在消费数据,kill消费者线程;
  2. 设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费;
  3. 消费kafka与业务逻辑在一个线程中处理,可能出现消费程序业务处理逻辑阻塞超时,导致一个周期内,offset还未提交;继而重复消费,但是业务逻辑可能采用发送kafka或者其他无法回滚的方式;

2.2 问题分析

底层根本原因:已经消费了数据,但是offset没提交。
配置问题:设置了offset自动提交
重复消费最常见的情况:re-balance问题,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-balance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。

2.3 问题解决

解决办法:至少成功发送一次+去重操作(幂等性)

2.3.1 如何保证至少成功发送一次

保证不丢失消息:
生产者(ack=all 代表至少成功发送一次)
消费者 (offset手动提交,业务逻辑成功处理后,提交offset)

2.3.2 去重操作(幂等性)
  • 去重问题:消息可以使用唯一id标识
  • 保证不重复消费:落表(主键或者唯一索引的方式,避免重复数据)
    业务逻辑处理(选择唯一主键存储到Redis或者mongdb中,先查询是否存在,若存在则不处理;若不存在,先插入Redis或Mongdb,再进行业务逻辑处理)

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

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

相关文章

c++之vector容器

1.简介 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 1.1 vector和…

HyperAI超神经 x 中国信通院 | 可信开源大模型案例汇编(第一期)案例征集计划正式启动自定义目录标题)

为进一步促进大模型的开源和合作,引导开源大模型产业健康规范发展,中国信息通信研究院现开启「可信开源大模型案例汇编(第一期)」的案例征集计划。 HyperAI超神经将以合作伙伴的身份,协助调研国产开源大模型的技术细节…

敏捷开发用户故事

产品Backlog中的需求通常使用用户故事来表达。 用户故事是从用户(需求方)的视角描述对用户有价值的需求 Who 这个需求为谁服务 What 具体要做什么 Why 目的是什么 一个典型的用户故事会以如下形式表达: 用户故事格式示例: 作…

基于SC-LeGO-LOAM的建图和ndt_localizer的定位

link 基于SC-LeGO-LOAM的建图和ndt_localizer的定位 链接: link. SC-LeGO-LOAM 链接: link. ndt_localizer 将建图和定位两部分分开,利用SC-LeGO-LOAM进行建图,相比于LeGO-LOAM,其采用了Scan Context方法,对点云地图进行闭环检测和…

5G智能安全帽_实时对讲/视频通话/高精度定位_智能安全帽功能介绍

5G智能安全帽是一种具有工业级高清晰度摄像头和5G/WIFI网络功能的产品。在传统安全帽的基础上,智能安全帽集成了摄像头、语音和通信主板等模块。它具备高清视频采集、语音通讯、对讲、本地视频存储等功能,通过这种佩戴式设备,不仅可以实现数据…

app逆向之charles配置

声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究 目录 charles配置手机配置 charles配置 最近有点…

瑞数专题五

今日文案:焦虑,想象力过度发酵的产物。 网址:https://www.iyiou.com/ 专题五主要是分享瑞数6代。6代很少见,所以找理想哥要的,感谢感谢。 关于瑞数作者之前已经分享过4篇文章,全都收录在瑞数专栏中了&am…

arcpy.message实现探索

arcpy 位置D:\Program Files\GeoScene\Pro\Resources\ArcPy\arcpy\__init__.py ”““AddMessage(消息) 创建可以使用任何GetMessages函数访问的地理处理信息消息(Severity0)。 message(字符串):要添加的消息。”“ arcpy.geoprocessing D:\Program Files\GeoScene\Pro\Re…

求购供应发布农业副业产品市场行情小程序开发

农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步:一键获取全国近200家农产品批发市场的商品价格,包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态,保障信息的准确性和时效性。 前端VIP权益功能&…

WPF RelativeSource属性-目标对象类型易错

上一篇转载了RelativeSource的三种用法,其中第二种用法较常见,这里记录一下项目中曾经发生错误的地方,以防自己哪天忘记了,又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下: 控件关联其父级容器的属性—…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度&#xff0…

C语言 Number 1 基本数据类型

数据类型的定义 c语言的数据分类基本类型整型浮点型float和double的精度和范围范围精度 枚举类型空类型派生类型派生的一般表达形式 注 c语言的数据分类 首先是针对C语言的数据类型做个整理 大致分为四个大类型 基本类型枚举类型空类型派生类型 那么根据以上四个大类型 我们…

万物摩尔定律:人工智能技术的快速迭代将使人类万劫不复?

第一次工业革命:蒸汽机时代; 第二次工业革命:电气化时代; 第三次工业革命:信息化时代; 第四次工业革命:智能化革命。这一场革命正在上演,是人工智能(AI)带…

预处理详解(一)

1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是…

试题二(15分)和试题三(15分) (软件设计师笔记)

🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣…

Web安全系列——XSS攻击

文章首发公众号: 海天二路搬砖工 一、什么是XSS攻击 XSS (Cross-site scripting)攻击,即跨站脚本攻击。 攻击者通过在受害者的浏览器中注入恶意代码,攻击受害者的登录凭证、盗取敏感信息或控制受害者的会话等。 XS…

泛微e-office download.php任意文件

0x01 应用介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件,国内协同OA办公领域领导品牌,致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案 0x02 影响版本及语法特征 泛微e-offcie9 fofa:app”泛微-EOffice” && b…

掌握 JavaScript 的基本语法

一、javascript书写位置 JavaScript 可以写在 HTML 页面中的以下三个位置&#xff1a; 内联脚本&#xff1a;将 JavaScript 代码直接写在 HTML 元素的 onclick、onload、onsubmit 等事件属性中。例如&#xff1a; <button onclick"alert(Hello World)">点击我…

测试遇到bug怎么分析,这可能是我看到最专业的总结了!

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…