针对线上消息积压的排查思路以及解决方案

一、背景

我们在日常工作中,经常会碰到线上告警,消息队列消息积压了,试想如果对消息的消费速率有要求的场景,消息积压一定会或多或少对自己本身的业务场景有影响,这里就针对消息积压的场景,谈谈具体的排查思路以及解决方式

二、案例分析

由于在公司使用的kafka的场景会比较多,所以下面就以Kafka的场景进行分析,其他消息中间件的排查思路以及解决方式类似,可以举一反三。

(1)消息堆积感知

我们一般知道消息堆积一般是通过监控告警得知,或者用户反馈什么场景怎么这么久还没计算出来,这个时候我们就得警惕了,回想这个场景是不是使用消息队列进行实现,是不是有可能消息堆积导致。

分享最近的案例,我们会用变更日志记录用户或者系统的一些操作,记录变更日志是通过消息队列(Kafka)进行实现,如下图所示

产品反馈具体某个业务场景,明明已经执行过了,但是还是没有看到变更日志记录,当时我的第一反应就是会不会消息积压了,通过查看消息监控,消息果然积压了。

(2)消息积压排查思路

消息积压也分类型,下面我对自己遇到过的场景进行归类

场景一、生产者消息量本身就是这么大,消费者消费速度跟不上消息的生产速度(较严重,如果不提升消费能力,消息积压会越来越严重,这种属于上线之前对生产者的生产能力和消费者的消费能力评估不到位导致

场景二、业务高峰期,消息瞬时增大,原本生产者和消费者是保持平衡(或者消费能力略大于生产能力),但是由于生产者的消息量在某个时间段激增,导致消息积压。

场景三、原本生产者生产消息数量和消费者消费消息数量持平,但是经过一段时间的业务发展,消费者渐渐乏力,导致了消息积压(需处理)

(3)解决方案

针对上面的场景,其实本质上就是提升消费能力,消费能力提升后,消费的消息就多了,积压的消息就自然减少了。

解决方案总结:

1、首先我们得明确消息队列本来就是用来异步、解耦、削峰,先评估是否对业务有影响,如果没影响是否可以慢慢消费,不进行处理。

2、增加消息队列分区,这种情况适用于生产节点较多,例如生产有20个节点,消息队列分区数是6个,这个时候其实有些节点是没有进行消费的,可以将分区数扩大到12或者16,让更多节点参与消费,增大消费能力。但需注意分区扩充后就无法再进行缩小。

3、紧急排查代码是哪里有严重阻碍拖慢整个消费者消费能力的逻辑,改造消费者逻辑,将耗时逻辑进行优化,可以用上我们常用的缓存技术、异步化处理,并发处理等等,具体场景需具体分析,将这段逻辑进行优化,提升我们消费者的消费速度,消费速度快了,消费能力自然就上去了,积压的消息自然就会减少。

具体解决方案:

回到刚才说到我遇到的日志系统消息积压的问题,我通过观察发现生产环境消息队列的分区数只有2个,但实际生产有14个节点,应该是业务发展,更多的业务场景接入了日志系统,导致消费者的消费能力渐渐跟不上生产者的生产能力,所以我选择增加分区,分区数增加到8,让更多的节点参与消费,即解决了这个问题,后续观察消费者的消费能力是大于生产者的生产能力,不会再产生消息堆积。

三、总结

针对消息积压的场景,我们的解决思路的大方向一定是围绕提升消费能力的方向去处理,在现实生活中,就像银行办理业务的原理一样,如果每天都是排长队,要么是新开窗口,让更多的窗口帮助人们办理业务,或者引流到其他银行分行进行处理,本质上都是提升单位时间处理业务的能力。所以我们再解决消息积压的方向也是要围绕这个点进行处理。

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

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

相关文章

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 37 : Python爬虫入门大纲 章节1:Python爬虫概述 1.1 什么是爬虫? 网页爬虫(Web Crawler)是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域,热力图是一种非常直观的表现形式,它通过颜色深浅来展示数据分布情况。在Vue项目中,我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图: 一、准备…

Python或R时偏移算法实现

🎯要点 计算单变量或多变量时序距离,使用欧几里得、曼哈顿等函数量化不同时序差异。量化生成时序之间接近度相似性矩阵。使用高尔距离和堪培拉距离等相似度测量。实现最小方差匹配算法,绘制步进模式的图形表示。其他语言包算法实现。 &…

vue3 + ts + cesium:绘制、更新圆 ellipse

本文主要实现基础的绘制圆形,并且可以通过拖动圆心更新圆的位置,拖动圆上的边缘点改变圆的半径。 实现效果: (1)单击鼠标左键开始绘制,确定圆的圆心,移动鼠标,改变圆的半径&#xff…

Mac屏蔽系统更新,取出红点标记如果解锁hosts文件

引言:关闭系统更新,首先应该在系统偏好设置---软件更新---去掉自动更新的选项。即使如此,系统仍然进行macOS系统和自带safari等软件的检测更新,并图标右上角红点点标记提醒我们更新,那我们如果彻底屏蔽更新呢&#xff…

解决 Adobe 盗版弹窗

在这个文件夹下删除 Adobe CCXProcess 然后重装。 Adobe Premiere Pro 2024 (v24.6.1) Multilingual :: Варез от m0nkrusa [Warez by m0nkrus] (monkrus.ws) Adobe Photoshop 2024 (v25.12) Multilingual :: Варез от m0nkrusa [Warez by m0nkrus] (monkrus.…

Spring Boot RESTful API开发教程

一、RESTful API简介 RESTful API是一种基于HTTP协议的Web API,其设计原则是简单、可扩展、轻量级、可缓存、可靠、可读性强。RESTful API通常使用HTTP请求方法(GET、POST、PUT、DELETE等)来操作资源,使用HTTP状态码来表示操作结…

JQuery基本介绍和使用方法

文章目录 JQuery基本介绍和使用方法引入依赖 jQuery语法jQuery选择器jQuery事件操作元素获取/设置元素内容获取/设置元素属性获取/返回css属性添加元素删除元素 JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是…

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

PostgreSQL Docker Error – 5432: 地址已被占用

PostgreSQL Docker Error – 5432: 地址已被占用 今天在学习【Spring Boot React】价值79.9美元&#xff0c;全栈开发&#xff0c;搭建个人网站、做毕业设计、试试这套课程第17~21节视频的时候&#xff0c;发现运行docker run --name demo-postgres -e POSTGRES_PASSWORDpass…

【C++】类与对象(三)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C &#x1f308;喜欢的诗句:天行健,君子以自强不息. 目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 二…

pycharm中使用anaconda创建多环境,无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

问题描述 用的IDE是&#xff1a; 使用anaconda创建了一个Python 3.9的环境 结果使用pip命令的时候&#xff0c;报错 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 为了不再增加系统变量&#xff0c;我们直接将变量添加在当前项目中你的Ter…

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff0c;照亮我们前行的路&#xff0c;无论风雨多大&#xff0c;我们都要坚持不懈。 一…

前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串

这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型&#xff08;基础类型&#xff09;合成类型&#xff08;复合类型&#xff09; 运算…

《15分钟轻松学 Python》教程目录

为什么要写这个教程呢&#xff0c;主要是因为即使是AI技术突起的时代&#xff0c;想要用好AI做开发&#xff0c;那肯定离不开Python&#xff0c;就算最轻量级的智能体都有代码块要写&#xff0c;所以不一定要掌握完完整整的Python&#xff0c;只要掌握基础就能应对大部分场景。…

使用VBA快速生成Excel工作表非连续列图片快照

Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

MAC备忘录空白解决方案

打开icloud->备忘录 取消勾选同步此MAC后再次勾选&#xff0c;然后点击完成即可。

【SpringCloud】服务注册/服务发现-Eureka

服务注册/服务发现-Eureka 1. 背景1.1 问题描述1.2 解决思路1.3 什么是注册中⼼1.4 CAP理论1.5 常⻅的注册中⼼ 2. Eureka 介绍3. 搭建Eureka Server 1. 背景 1.1 问题描述 上个章节的例⼦中可以看到, 远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:90…

Ubuntu24.04远程开机

近来在几台机器上鼓捣linux桌面&#xff0c;顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒&#xff0c;Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器&#xff08;当前一般都带这个功能&#xff09;有线连接主机&#xff08;无线连接有兴趣朋友…