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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解