MQ消息丢失和积压问题

2024-02-07 22:04
文章标签 问题 丢失 消息 mq 积压

本文主要是介绍MQ消息丢失和积压问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

文章目录

    • 背景
    • 如何解决消息队列的延时以及过期失效问题?
    • 怎么处理消息积压?
      • 消费故障
      • 消费过慢
    • 最后

背景

在上一篇文章 消息队列MQ 中,提到了MQ可以削峰和消息持久化,等待其它系统准备好后进行消费。那么消息积压过大是怎么处理的呢、消息队列的消息会过期失效吗

如何解决消息队列的延时以及过期失效问题?

消息队列中的消息是会过期失效的。

假设使⽤的是 RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在队列中积压超过⼀定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。那这就是第⼆个坑了。如果数据会⼤量积压在 mq ⾥,⼤量的数据可能会丢失。

如果丢失了大量的消息,只能等到高峰期过去之后,写一个临时程序手动将丢失的数据一点一点排查出来,重新发送给mq,进行批量重导数据补取。

  • 假设 1 w个订单积压在 mq ⾥⾯,没有处理,其中 1k 个订单都丢了,只能⼿动写程序把那 1k 个订单给查出来,⼿动发到 mq ⾥去再补⼀次。

怎么处理消息积压?

高峰期,积压原因:消费者由于⾃身原因消费失败、消费者消费消息过慢

消费故障

  1. 跳过非重要消息
    如果一些消息是允许丢失的,可以把消息全部丢弃

  2. 提高消费能⼒
    换个说法就是消费过慢,请继续往下看

消费过慢

  1. 增加机器的数量
    提⾼消费者的并⾏度,部署更多的 consumer 机器,Topic 的 MessageQueue 也需要有对应的增加

    • 因为如果 consumer 机器有5台,然后 MessageQueue 只有4个,那么意味着有⼀个consumer机器是获取不到消息的。
    • 加消费者机器(MessageQueue⽐消费者多,不改代码),临时申请多台机器多个部署消费者系统的实例,然后消费者系统同时消费,每个⼈消费⼀个MessageQueue的消息。处理完百万积压的消息之后,就可以下线多余的机器了。
    • 加消费者机器(MessageQueue少,需要改代码),这个时候就没办法扩容消费者系统了,因为加再多的消费者系统,还是只有⼏个 MessageQueue,没法并⾏消费。所以此时往往是临时修改那消费者系统的代码,让他们获取到消息不是正常去处理,⽽是直接把消息写⼊⼀个新的Topic,这个速度是很快的,因为仅仅是转发⼀下,不⽤业务处理。然后新的 Topic 有更多个 MessageQueue,然后再部署更多台临时增加的消费者系统,去消费新的 Topic,消费完之后恢复原状。
    • 在这里插入图片描述
  2. 增加消费者 consumer 的线程数量
    可以利用线程池给 consumer 分配更多的线程数量,⼀台 consumer 机器上的消费线程越多,消费的速度就越快。

@Service
public class MyConsumerService {@Autowiredprivate Executor messageExecutor;	// 自定义线程池@KafkaListener(id="test",topics={"topic-test"})public void listen(String message){System.out.println("收到消息:" + message);messageExecutor.submit(new MyWork(message);}
}
  1. 开启消费者的批量消费功能
    某些业务流程如果⽀持批量⽅式消费,则可以很⼤程度上提⾼消费吞吐量。
    优化每条消息消费过程,提升消费者的硬件配置或者改善消息消费的处理逻辑。

最后

慢慢的来,别着急!学会有质量的走过每一步


我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎添加小符微信:A13781678921,一起加油

这篇关于MQ消息丢失和积压问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689057

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map