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

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到