《深入理解kafka》对于实际问题的理解

Q1:消息可靠性(不重不漏)

1.1 如何保证消息不丢

1.2 如何保证消息不重

Q2:积压/消费能力

2.1 线上积压排查思路

2.2 增加消费能力

Q1:消息可靠性(不重不漏)

理解可靠性前。介绍消息语义,即消息传递的标准

标准

丢失

重复

适用场景

At most once(至多一次)

会丢失

不会重复

高并发高吞吐,允许消息丢失,如日志收集

At least once(至少一次)

不会丢失

会重复

Exactly once(恰好一次)

不会丢失

不会重复

1.1 如何保证消息不丢

从各个层面分析

  • 参照:​《深入理解kafka-核心设计与实践原理》​第8.3章 + 自己理解

层面

事项

生产者(客户端)

  • 代码发送层面

    • ①发送消息Api的三种模式:发后即忘、同步和异步。发后即忘会丢失消息,后两者能知道是否发送成功

    • ②补发消息机制:客户端持久化消息,支持消息的补偿

  • 配置层面

    • ③生产者客户端参数(acks参数):acks= -1最可靠,其余两种都可能会丢失消息

    • ④重试参数(retries参数和retry.backoff.ms参数):对于可重试的异常(如网络抖动),通过失败重试机制重发消息

Broker服务端

服务端需要注意的都是配置参数层面

  • ①副本数(replication.factor参数) > 1

    • 越多的副本数越能够保证数据的可靠性,但副本太多会影响性能。应对宕机风险,通常设置为3就能满足大多数场景

  • ②ISR集合中的最小副本数(min.insync.replicas参数) >1

    • 用于辅助配合acks=-1来使用:leader副本的消息流入速度很快,而follower副本的同步速度很慢。在某个临界点时所有的follower副本都被剔除出了ISR集合,那么ISR最终只剩一个leader副本,导致acks=-1演变为acks=1的情形

    • 该值必须小于副本数,一个典型的配置是:replication.factor=3,min.insync.replicas=2

  • ③是否允许从非ISR中选举新leader(unclean.leader.election.enable参数) = false:默认为false,不允许

    • 非ISR集合中,可能还未同步所有消息,设置成true会造成消息丢失

  • 其他:log.flush.interval.messages和log.flush.interval.ms,是否开启同步刷盘(默认是不做控制而交由操作系统本身来进行处理)

    • 可能性分析:由于刷盘是操作系统控制,理论上讲会存在即使kafka写入成功,但由于机器宕机,操作系统未及时刷盘,丢失数据的风险

    • 但同步刷盘非常损耗性能,改成每次提交时手动同步刷盘对性能影响太大。这里不建议修改此配置,因为发生可能性很小

消费者(客户端)

①自动提交(enable.auto.commit参数) = false:默认为true,自动提交。不再介绍,见3.2.5节

  • 自动提交会带来重复消费和消息丢失的问题:消费者还未执行完业务流程,异步线程已对服务端发起了提交

  • 手动提交需遵守一个原则:如没有消费完,则不能提交

1.2 如何保证消息不重

消息重复无法避免,只能在消费者消费时过滤重复消息。可能的重复原因如下:

根因

生产者

业务方代码原因:对同一份消息内容发送了多次

网络问题:生产端发送消息后,服务端已经收到消息了,但是假如遇到网络问题,无法获得响应,生产端就无法判断该消息是否成功提交到了 Kafka,而我们一般会配置重试次数,但这样会引发生产端重新发送同一条消息,从而造成消息重复的发送

Broker服务端

服务端不会重复存储消息,如果有重复消息也应该是由生产端重复发送造成的

消费者

分区重分配引起

  • 在客户端实例变化、分区扩容、集群切换等场景会涉及到分区重分配,由于新老客户端感知分配结果不及时,可能出现两台机器短时间消费同一个分区的场景,造成重复消费

备注:分区重分配,与再均衡(rebalance)的区别

  • 重分配:作用在broker层面,是broker与partition间的分配;通常是为了管理优化集群手动触发
  • 再平衡:作用在消费组层面(新增/下线消费者),Rebalance的目的是确保分区在consumer group成员之间平均分配,以便每个consumer都有分区去消费;通常是Kafka协调器自动触发的

处理思路:幂等

从对系统的影响结果来说:At least once + 幂等消费 = Exactly once。

  1. 利用数据库的唯一约束实现幂等

  2. 记录消费结果并检查操作

Q2:积压/消费能力

2.1 线上积压排查思路

是什么引起的积压:

  • 先止损,快速定位积压的原因

    • 上游生产流量突增

    • 上游流量没变

      • 不消费了:

        • 消费者是否下线了?

        • 某一个partition的offset卡住了?

      • 还在消费:消费能力下降?

2.2 增加消费能力

搞清原因:什么导致【消费速率 < 生产速率】

生产速率

可能原因

解决方案

备注

生产速率不高

自身业务消费链路长,导致消费慢

优化消费链路

绝大多数情况

生产速率高

①消费者实例 < partition数量。一台机器消费多个partition的情况,并且机器负载较高

扩集群机器,一直到【消费者:partition=1:1】

影响可控

②消费者实例:partition = 1:1,但消费速率仍小于生产速率

扩partition。但一未扩partition会增加服务端负载

③partition本身已很多,但生产速率实在太大

增加单partiton并行消费线程数目(这种方式不保证消费顺序!!!

  • mafka和rocketmq支持,kafka与rabbitmq不支持

  • 总体思路:滑动窗口

是不是该考虑架构与技术选型的问题了?

④生产速率实在太大了

pushServer

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

暂不要创业,谁创业谁死

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 卢松松视频号会员专区有个会员提问&#xff0c;我感觉挺有代表性的&#xff0c;写成公众号文章&#xff0c;分享给大家&#xff1a; 松哥&#xff0c;我花了太多时间在思考上&#xff0c;而一直没有行动&#xff…

ESG视角下的多期DID构建(2009-2022年)4.5万+数据

随着ESG信息越来越受到重视&#xff0c;一些第三方评级机构开始推出ESG评级产品&#xff0c;目前在第三方数据库能够查到华证、富时罗素、商道融绿、社会价值投资联盟以及Wind自有的ESG评级数据等。其中&#xff0c;商道融绿是中国最早发布ESG评级数据的机构&#xff0c;也是国…

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期&#xff08;Vue2&#xff09; 目录 一文读懂Vue生命周期&#xff08;Vue2&#xff09;1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

VS Code 远程连接 SSH 服务器

文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新&#xff0c;在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器&#xff08;我曾经也是个 …

VueComponent构造函数

//创建school组件——注册给谁 在谁的结构上写const school Vue.extend({name: school,//开发者工具的显示template: <div><h2>学校名称&#xff1a;{{schoolName}}</h2><h2>学校地址&#xff1a;{{adress}}</h2> </div>,//结构data() {…

好用的win10电脑桌面便利贴,桌面便签小工具

在日常办公中&#xff0c;我们经常需要记录重要事项、提醒任务或者临时想法。这时&#xff0c;一款好用的电脑桌面便签或便利贴小工具就显得尤为重要。它们能够帮助我们高效地管理信息&#xff0c;提升工作效率。 那么好用的win10电脑桌面便利贴是哪个呢&#xff1f;电脑桌面便…

算法学习:二分查找

&#x1f525; 引言 在现代计算机科学与软件工程的实践中&#xff0c;高效数据检索是众多应用程序的核心需求之一。二分查找算法&#xff0c;作为解决有序序列查询问题的高效策略&#xff0c;凭借其对数时间复杂度的优越性能&#xff0c;占据着算法领域里举足轻重的地位。本篇内…

It‘s possible that the file was already in use (by a text editor or antivirus)

方法一 删除用户下的.npmrc文件&#xff0c;即不改变全局安装的路径&#xff08;不够好&#xff0c;本质问题仍没有解决&#xff0c;全局还是会安装在C盘&#xff09; 每次都用管理员身份运行命令行&#xff08;不够方便&#xff0c;vscode 下的命令行默认也不是管理员身份运行…

linux通过使用bash脚本同时运行多个命令

1、使用&&或||或;&#xff08;根据需要选择连接符号&#xff09;等来连接多条命令 && -> "与"&#xff0c;一条命令执行出错&#xff0c;则后面命令不执行 || -> "或"&#xff0c;一条命令执行成功&#x…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

BigDecimal:踩坑

问题描述 两个BigDecimal相除, 抛了异常 原因分析&#xff1a; Java 中使用 BigDecimal 做除法运算的时候&#xff0c;值有可能是无限循环的小数&#xff0c;结果是无限循环的小数&#xff0c;就会抛出上面这个异常。 来看看源码&#xff1a; public BigDecimal divide(BigD…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

SOLIDWORKS Electrical电气智能零部件的运用

电气2D向电气3D转型&#xff0c;3D模型无疑是重中之重&#xff0c;精准、正确的3D模型有利于电线长度、空间大小、耗材的计算。而线槽、导轨因为要根据实际情况裁剪&#xff0c;所以即使同一规格的线槽、导轨&#xff0c;在装配时也得根据实际情况&#xff0c;修改长度&#xf…

AAA、RADIUS、TACACS、Diameter协议介绍

准备软考高级时碰到的一个概念&#xff0c;于是搜集网络资源整理得出此文。 概述 AAA是Authentication、Authorization、Accounting的缩写简称&#xff0c;即认证、授权、记帐。Cisco开发的一个提供网络安全的系统。AAA协议决定哪些用户能够访问服务&#xff0c;以及用户能够…

linux系统-PXE高效批量网络装机

目录 一、PXE概述 PXE批量部署的优点 搭建PXE网络体系的前提条件 二、搭建PXE远程安装服务器 1.修改网络配置 2 .老样子关防火墙&#xff01;&#xff01;&#xff01;&#xff01; 3.确保挂载状态 和yum库 4. 安装TFTP服务 5.修改TFTP服务的配置文件 6.启动服务 7…

概念解析 | 基础模型:AI时代的“形而上学“

注1:本文系"概念解析"系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:基础模型(Foundation Models) 概念解析 | 基础模型:AI时代的"形而上学" What Are Foundation Models? | NVIDIA Blogs 第一部分:通俗解释 基础模型(…

echars设置渐变颜色的方法

在我们日常的开发中&#xff0c;难免会遇到有需求&#xff0c;需要使用echars设置渐变的图表&#xff0c;如果我们需要设置给图表设置渐变颜色的话&#xff0c;我们只需要在 series 配置项中 添加相应的属性配置项即可。 方式一&#xff1a;colorStops type&#xff1a;‘lin…

this关键字

this 文章目录 this引出Thisthis的作用this.属性内存分析 this.方法名this(&#xff09;构造方法 概念&#xff1a;this 关键字是 Java常用的关键字&#xff0c;可用于任何实例方法内指向当前对象&#xff0c;也可指向对其调用当前方法的对象&#xff0c;可以将this理解为一个指…
最新文章