RabbitMQ、kafaka、rocketmq等消息队列MQ消息堆积如何解决

文章目录

    • 概述
    • 解决方案
    • 消息堆积如何处理
    • 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?

概述

1.产生背景: 生产者投递消息的速率与我们消费者消费的速率完全不匹配。
2.生产者投递消息的速率>消费者消费的速率
导致我们消息会堆积在我们 mq 服务器端中,没有及时的被消费者消费 所以就会产生消息堆积的问题
3.注意的是:rabbitmq 消费者我们的消息消费如果成功的话 消息会被立即删除(自动ack)
kafka 或者 rocketmq 消息消费如果成功的话,消息是不会立即被删除。
4.解决办法:
A.提高消费者消费的速率;(对我们的消费者实现集群)
B.消费者应该批量形式获取消息 减少网络传输的次数;

解决方案

消息堆积是消息队列系统中常见的问题,可能会导致系统性能下降、延迟增加甚至消息丢失。下面是一些解决 RabbitMQ、Kafka、RocketMQ 等消息堆积问题的方法:

  1. 监控和预警:
    设置监控指标,定期监控消息队列中消息积压情况,如消息堆积量、消费者处理速度等。当消息堆积超过阈值时,发送预警通知,及时发现问题并采取措施。
  2. 扩展消费者:
    增加消费者数量,提升消息处理速度,以缓解消息堆积问题。可以动态地增加消费者实例来分担消息处理压力,确保消息能够及时被处理。
  3. 优化消费者端处理逻辑:
    检查消费者端的处理逻辑是否高效合理,避免因为消费者处理速度慢导致消息堆积。优化消费者代码,减少不必要的处理时间,提高消息处理效率。
  4. 调整消息消费方式:
    根据业务需求和场景,调整消息消费方式,如批量消费、并发消费等。合理利用消息队列提供的特性,提高消息消费效率,减少消息堆积发生的可能性。
  5. 调整消息队列参数:
    根据实际情况,调整消息队列的参数设置,如队列长度、超时时间等。合理设置参数可以更好地适应业务需求,防止消息堆积问题的发生。
  6. 消息重试机制:
    实现消息重试机制,当消息处理失败时,自动进行重试,确保消息最终被正确处理。避免因为消息处理失败而导致消息堆积问题。
  7. 定时清理历史数据:
    定期清理历史数据,删除过期和无用的消息,释放存储空间,避免消息堆积。保持消息队列的数据清洁,有助于提高系统的性能和稳定性。

消息堆积如何处理

主要是消息的消费速度跟不上生产速度,从而导致消息堆积。解决思路:
1.可能是刚上线的业务,或者大促活动,流量评估不到位,这时需要增加消费组的机器数量,提升整体消费能力
2.也可能是消费端的问题,正常情况,一条消息处理需要10ms,但是优化不到位或者线上bug,现在要500ms,那么消费端的整体处理速度会下降50倍。这时,我们就要针对性的排查业务代码。例如数据库的一条sql没有命中索引,导致单条消息处理耗时拉长,进而导致消息堆积

如果 bug 导致几百万消息持续积压几小时。有如何处理呢? 需要解决bug,临时紧急扩容,大概思路如下:
1.先修复 consumer 消费者慢问题,以确保其恢复消费速度,然后将现有consumer 都停掉。
2.新建一个 topic,partition 原来 10 倍,临时立好原先 10 倍 queue数量。
3.然后写一个临时分发数据consumer 程序,这个程序部署上去消费积压数据,消费之后不做耗时处理,直接均匀轮询写入临时立好10 倍数量queue。
4.接着临时征用 10 倍机器来部署 consumer,每一批 consumer 消费一个临时queue 数据。这种做法相当于临时将 queue 资源和 consumer 资源扩大10 倍,以正常 10 倍速度来消费数据。
5.等快速消费完积压数据之后,得恢复原先部署架构,重新用原先consumer 机器来消费消息。

如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?

消息积压处理办法:临时紧急扩容先修复 consumer 的问题,确保其恢复消费速度,然后将现有 cnosumer 都停掉。新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。 MQ中消息失效:假设你用的是 RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。那这就是第二个坑了。 这就不是说数据会大量积压在 mq 里,而是大量的数据会直接搞丢。我们可以采取一个方案,就是批量重导,这个我们之前线上也有类似的场景干过。就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,比如大家一起喝咖啡熬夜到晚上12点以后,用户都睡觉了。这个时候我们就开始写程序,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回来。也只能是这样了。假设 1 万个订单积压 在 mq 里面,没有处理,其中 1000 个订单都丢了,你只能手动写程序把那 1000 个订单给查出来,手动发到 mq 里去再补一次。 mq消息队列块满了:如果消息积压在 mq 里,你很长时间都没有处理掉,此时导致 mq 都快写满了,咋办?这个还有别的办法吗?没有,谁让你第一个方案执行的太慢了,你临时写程序,接入数据来消费,消费一个丢弃一个,都不要了,快速消费掉所有的消息。然后走第二个方案,到了晚上再补数据吧。

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

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

相关文章

项目管理软件:如何确保项目启动顺利?

对所有项目经理来说,了解如何启动项目是最关键的技能之一。项目都是从小事开始,逐渐发展为更大型、更复杂的。好的开始是成功的一半,对项目管理来说更是如此。 启动项目的 10 个简单步骤 即使是最复杂的项目,也可以分解成简单的…

爬虫练习:获取某网站的房价信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…

计算机丢失msvcp140.dll是什么意思,电脑自带dll修复安装下载

在使用电脑的过程中那个大家是不是有遇到过电脑丢失某个文件,导致电脑的程序不能继续运行,那么出现这样的问题有什么办法可以解决呢?其实解决办法还是有很多的!今天这篇文章就教大家如果电脑丢失的msvcp140.dll文件那么该怎么办&a…

基于PHP的餐厅管理系统APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 MVC 3 1.2 ThinkPHP 3 1.3 MySQL数据库 3 1.4 uni-app 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 7 2.3 非功能需求 8 2.4 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 3.2 系统详细设计 10 3.3 本章小…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt,让Qt自己识别系统环境,不知道为什么Qt在之后的版本,这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator,感觉失去了一些灵活性。 自己测试…

C语言简单题(2)水仙花数、素数问题、斐波那契数列问题、回文数问题、求阶乘、一元二次方程的解、统计字符个数

/* 水仙花数&#xff1a;输入一个三位数&#xff0c;判断是否为水仙花数 水仙花数指一个三位数&#xff0c;各位数的立方和等于其本身&#xff0c;如 153 1*1*1 5*5*5 3*3*3 #include<stdio.h> int main(){ int n; printf("请输入一个三位数n&q…

学c还行,学Python很累,还有其他语言适合我吗?

学c还行&#xff0c;学Python很累&#xff0c;还有其他语言适合我吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&a…

mysql的其他问题

1.MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f; a. 设计良好的数据库结构&#xff0c;允许部分数据冗余&#xff0c;尽量避免join查询&#xff0c;提高效率。 b. 选择合适的表字段数据类型和存储引擎&#xf…

基于SSM的网络教学系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 B/S架构技术 3 1.2 Ajax技术 3 1.3 JavaScript 4 1.4 jQuery 4 1.5 SSM框架 4 1.5.1 Spring 5 1.5.2 Spring MVC 5 1.5.3 MyBatis 5 1.6 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统用例分析 8 2.3 非功能需求分析 …

最全软件测试面试问题和回答,适合全文背诵

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

精通SpringBoot单元测试

引言 单元测试是软件开发中不可或缺的一部分&#xff0c;它对保障代码质量和软件的可靠性起着至关重要的作用。而SpringBoot作为一个流行的Java框架&#xff0c;为开发高效、易于部署的微服务提供了强大的支持。 单元测试的重要性&#xff1a; 确保代码正确性&#xff1a;通过…

安全知识分享域渗透

内网渗透思维导图 密码相关域渗透攻击思路DACL的应用NTLM 中继攻击滥用 ACE 内网渗透思维导图 专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; 密码相关 域渗透攻击思路 常见攻击手法&a…

Paimon新版本核心特性和生产实践解读

最近Apche Paimon发布了最新版本0.7.0&#xff0c;在这个版本中&#xff0c;Paimon对一些新特性进行了增强。 Paimon在数据湖领域发展迅速&#xff0c;未来会在整个数据开发领域占有很重要的地位&#xff0c;今天我们来盘点一下当前能力的特点以及在生产环境中的使用情况。 Loo…

fastgpt本地详细部署以及配置

目录 一、Docker部署1、docker安装2、docker启动3、添加用户到 docker 组:4、验证 Docker 安装:二、one_api 本地部署1、linux系统部署2、windows系统部署三、向量模型部署(m3e)四、chatglm2模型本地部署五、fastgpt模型本地部署1、下载配置文件2、文件配置--docker-compos…

Windows环境编译webots遇到报错:‘gbk‘ codec can‘t decode byte 0x93 in position 547

Windows环境下编译webots的官方说明在 https://github.com/cyberbotics/webots/wiki/Windows-installation/ &#xff0c;概括起来就是&#xff1a;先安装MYSYS2&#xff0c;然后git clone --recurse-submodules -j8 https://github.com/cyberbotics/webots.git &#xff0c;最…

finalize方法做什么用的?

在Java中&#xff0c;finalize() 方法是一个被垃圾回收器调用的特殊方法&#xff0c;用于执行对象在被回收之前的清理操作。当Java虚拟机确定某个对象没有被任何引用引用时&#xff0c;会将其标记为垃圾对象&#xff0c;接着在适当的时间由垃圾回收器回收这些对象。在回收对象之…

大数据赋能,能源企业的智慧转型之路

在数字洪流中&#xff0c;大数据已经成为推动产业升级的新引擎。特别是在能源行业&#xff0c;大数据的应用正引领着一场深刻的智慧转型。今天&#xff0c;我们就来探讨大数据如何在能源企业中发挥其独特的魅力&#xff0c;助力企业提效降本&#xff0c;实现绿色发展。 动态监控…

BK7231+字库+LCD显示

1、BK7231有2M flash&#xff0c;可以保存1个16*16汉字字库 2、驱动1个8位并口屏&#xff0c;将字库中的汉字中显示出来 一、将gb2312_80.bin打包到烧录镜像中。 1、bk7231u_rtt_sdk\OTAPackage\beken_packager中修改config.json文件&#xff1a; {"magic": "…

_note_26

1.介绍一下 MyBatis MyBatis是一个开源的持久层框架&#xff0c;它提供了一种简单且强大的方式来管理数据库访问。MyBatis允许开发者使用XML或注解的方式来配置SQL映射&#xff0c;以及提供了灵活的参数绑定和结果映射功能。它与数据库交互的方式是通过SQL语句直接与数据库进行…

2024济南艾灸设备展/山东艾草制品展/中国艾健康发展大会

艾草健康&#xff0c;全民共享&#xff1b;推动传统医学文化瑰宝&#xff0c;弘扬民族医药健康文化&#xff1b; 2024第6届中国&#xff08;济南&#xff09;国际艾健康产业展览会&#xff08;CIWHE中国艾博会&#xff09; The 6th China (Jinan) International Wormwood Heal…