微服务框架下,因发送端与消费端的vhost不一致,导致rabbitmq出现严重的消息堆积

一、背景

在生产环境下,rabbitmq机器出现磁盘空间不足的报警,发现是某个队列的消息只有生产,迟迟没有消费。

在这里插入图片描述
在这里插入图片描述

可以得到的信息是:

  • 队列queue是data_center_file_change_queue
  • 队列绑定的交换机是resourceChangeExchange,见下图
  • 队列所在的vhost是/
    在这里插入图片描述

之所以出现rabbitmq消息堆积,是因为消费程序所在的vhost与消息生产者所在的vhost不是同一个。

下面将逐步说明其排查过程,以及解决方法。

二、服务架构

在这里插入图片描述
在微服务框架下,两个服务之间,通过rabbitmq来解耦。

三、问题排查

消息没有被消费,首先怀疑的一点是:发送方或者消费方修改了消息体,因为出现异常,导致消费失败,从而重新放入了队列。

1、尝试解码消息内容

在这里插入图片描述

base64解密工具,输入上面的消息体,进行解密。

在这里插入图片描述

2、对比分析生产者和消费者的java代码

近期没有修改过报文体,而且我看消费者的代码,都有对异常进行捕获。

也就是说,消费端无论是消费成功还是失败,该消息就算在出现异常的时候,也会被视为已消费。(并不会出现消息堆积)

3、生产和消费的双方是否处于同一个vhost

检索队列名称,发现同样的队列名,在不同的vhost都存在。详见下图:

在这里插入图片描述

进一步查看程序的配置,得知消息生产程序并未指定vhost,默认使用的是/

而消息消费程序,指定了vhost,如此导致两边的vhost不一致。

这是导致rabbitmq出现严重的消息堆积的根源。

4、保证程序的vhost一致

  • 消费端程序配置的vhost

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

  • 生产端程序配置的vhost
    在这里插入图片描述

四、验证

在这里插入图片描述

经过一段时间,看到堆积的消息正被慢慢消费掉。
在这里插入图片描述

最后积压的消息全部被消费成功。
在这里插入图片描述

在这里插入图片描述

五、程序的代码示例

1、消息生产者

@Configuration
public class RabbitConfig {
    @Bean
    public FanoutExchange resourceChangeExchange() {
        return new FanoutExchange("resourceChangeExchange");
    }
}
    @Resource(name = "rabbitTemplate")
    private AmqpTemplate rabbitTemplate;
    
	Map<String, Object> map = Maps.newHashMap();
    map.put("xxxx", "");
        
    this.rabbitTemplate.convertAndSend("resourceChangeExchange", "", map);

2、消息消费者

    public interface RabbitMQ {
        /**
         * 资源中心文件变动队列 名 (变动事件)
         */
        String DATA_CENTER_FILE_CHANGE_QUEUE = "data_center_file_change_queue";

        /**
         * 资源中心文件变动队列 名 (变动事件) Direct交换机名
         */
        String DATA_CENTER_FILE_CHANGE_DIRECT_EXCHANGE = "resourceChangeExchange";
   }
@Configuration
public class RabbitMqConfig {
    @Bean
    public Queue dataCenterFileChangeQueue() {
        return new Queue(RabbitMQ.DATA_CENTER_FILE_CHANGE_QUEUE, true, false, false, null);
    }
    
    @Bean
    public FanoutExchange dataCenterFileChangeDirectExchange() {
        return new FanoutExchange(RabbitMQ.DATA_CENTER_FILE_CHANGE_DIRECT_EXCHANGE, true, false);
    }
}
  • 消费mq消息
    @RabbitListener(queues = RabbitMQ.DATA_CENTER_FILE_CHANGE_QUEUE)
    public void listener(Map<String, String> messageMap, Message message, Channel channel) {
	// messageMap 是mq消息体
}

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

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

相关文章

【画板案例-线宽 Objective-C语言】

一、接下来,我们来说这个,线宽, 1.示例程序里边,这个slider,是改变线宽的,在最左边的时候,我画一下, 是这种线宽,还是有一定宽度的啊,跟我们这个默认的,不是1像素, 然后,最右边呢,也是有一个宽度的, 然后呢,这个线宽,我就给它,最小值设置成5,最大值设置成3…

淘宝扭蛋机小程序,扭蛋市场创新模式

扭蛋机作为潮玩市场的娱乐消费方式&#xff0c;成为了当下消费者的新宠。扭蛋机凭借自身性价比高、商品多样、惊喜性等特点&#xff0c;吸引了各个年龄层的消费者&#xff0c;不仅年轻人喜欢&#xff0c;不少小学生和老年人也非常喜欢&#xff0c;扭蛋机市场迎来了快速发展期。…

【学习笔记】Windows GDI绘图(十二)双缓冲管理(用GIF动画测试)

文章目录 引言默认双缓冲SetStyle 手动管理双缓冲图形BufferedGraphicsManager缓冲图形管理器BufferedGraphicsContext 缓冲图形上下文BufferedGraphics 图形缓冲区验证双缓冲的效果(Gif动画显示非正常速度)结束语性能对比 引言 图形编程中一个常见的问题就是闪烁&#xff0c;…

男士内裤比较好的品牌有哪些?五款物超所值的男款内裤安利

挑选男士内裤时&#xff0c;哪一款更合适呢&#xff1f;这个问题想必让许多人感到困惑。现在市场上的男士内裤种类繁多&#xff0c;确实让人眼花缭乱&#xff0c;不知从何下手。为了帮助大家解决这一难题&#xff0c;今天特地为大家整理了一些选购男士内裤的技巧&#xff0c;并…

EverWeb 强大的零基础Mac网页设计制作软件

搜索Mac软件之家下载EverWeb 强大的零基础Mac网页设计制作软件 EverWeb 4.2是非专业网页设计师的绝佳网页制作工具&#xff0c;无需编码即可创建美观、响应迅速的网站。只需拖放自己的图像、文本和其他任何html元素到网页布局的任何位置。 EverWeb的功能特性&#xff1a; 下…

代理结算不再繁琐,Xinstall让App推广更轻松

在移动互联网时代&#xff0c;App的推广与获客已成为企业发展的重要一环。然而&#xff0c;随着推广模式的多样化&#xff0c;如何高效地管理App推广的代理结算&#xff0c;成为了许多企业面临的难题。Xinstall凭借其强大的超级渠道功能&#xff0c;为企业提供了一个完美的解决…

Shopee与Lazada卖家如何运用自养号测评稳定提升销量于评价

在跨境电商行业中&#xff0c;测评对于提高产品销量是个非常优秀的辅助方式。作为东南亚电商巨头&#xff0c;Shopee和Lazada这两大主流平台上&#xff0c;卖家竞争也尤为激烈&#xff0c;卖家们不断寻求有效的方法提升自己的产品销量。为了应对这一挑战&#xff0c;测评应运而…

物联网-高性能时序数据库QuestDB

高性能时序数据库QuestDB 开源地址&#xff1a;https://github.com/questdb/questdb 官网&#xff1a;https://questdb.io/ 当前 13.9k start 自带免费可视化管理界面 支持各种语言客户端 C & C .NET Go Java Node.js Python Rust 上手容易可兼容 Postgresql InfluxDB …

Major European 银行 X Incredibuild

关于公司 Major European 银行是一家顶级的跨国欧洲金融巨头&#xff0c;拥有跨越三个世纪的悠久历史&#xff0c;在包括英国、埃及和美国等关键市场在内的全球55个国家拥有业务。该机构提供从零售银行和财富管理&#xff0c;到投资咨询和风险管理的全面服务。 面临的挑战 M…

用贪心算法计算十进制数转二进制数(整数部分)

十进制整数转二进制数用什么方法&#xff1f;网上一搜&#xff0c;大部分答案都是用短除法&#xff0c;也就是除2反向取余法。这种方法是最基本最常用的&#xff0c;但是计算步骤多&#xff0c;还容易出错&#xff0c;那么还有没有其他更好的方法吗&#xff1f; 一、短除反向取…

漏洞挖掘 | 记一次信息泄露到登入后台

这次是项目上遇到的一个洞&#xff0c;打开页面是一个红红的登录页面 这里就不放图了&#xff0c;浓浓的红色气息~ 老样子抓登录包 虽然是明文传输但是爆破弱口令无果 f12大法&#xff0c;审计源代码&#xff0c;在其中一个js文件中发现了这个接口 拼接URL进行访问 感觉有点东…

热搜爆了!AI秒写3篇湖南高考作文,邀你来打分!

今天上午 全国高考语文科目结束 作文题目成为焦点 相关话题立刻冲上热搜 今年湖南高考采用的是新课标 I 卷 作文题涉及到了人工智能 引发大量网友讨论 ↓↓↓ 随着互联网的普及、人工智能的应用&#xff0c;越来越多的问题能很快得到答案。那么&#xff0c;我们的问题是…

Switch双系统:2024.6,自己动手丰衣足食版

文章目录 资源&#xff08;追本溯源&#xff09;AtmosphereHekateRekadoDBINXThemesInstallerTesla-MenuSysClkRetroArch其他常用插件 基础教程&#xff08;自己动手丰衣足食版&#xff09;大气层双系统教程安装插件大气层系统升级救砖和恢复官方系统版本其他不推荐使用使用Mac…

ts类型声明文件、内置声明文件

1. ts类型声明文件 在ts中以d.ts为后缀的文件就是类型声明文件&#xff0c;主要作用是为js模块提供类型信息支持&#xff0c;从而获得类型提示 1.1 第三方包用ts编写的&#xff0c;会自动生成一个 .d.ts文件&#xff0c;进行类型声明 1.2 有些包不是用ts编写的&#xff0c;在…

我国衡器市场规模逐渐扩大 出口量远大于进口量

我国衡器市场规模逐渐扩大 出口量远大于进口量 衡器是利用力的杠杆平衡原理或胡克定律来测定物体质量的一种仪器设备。随着生产技术逐渐进步&#xff0c;衡器的种类逐渐增多。根据衡量方法不同&#xff0c;衡器大致可分为非自动衡器、自动衡器等&#xff1b;根据结构原理不同&a…

策略模式+简单工厂

&#x1f347;工厂模式 &#x1f348;工厂模式向策略模式过度——工厂加一个保安 &#x1f34f;策略模式 &#x1f350;策略模式简单工厂 声明本文需要理解多态的基础上才能来学习 欢迎前来学习——继承和多态 学习记录 工厂模式 需要什么就生成什么 // 工厂模式 class Fact…

2. 数据的表示和运算

2.数据的表示和运算 文章目录 2.数据的表示和运算2.1.1进位计数制r进制计数法任意进制->二进制二进制<->八进制、十六进制二进制->八进制二进制->十六进制八进制->二进制十六进制->二进制 各种进制的常见书写方式十进制->任意进制整数部分小数部分 真值…

哈默纳科Harmonic谐波减速机应用领域有哪些

在制造设备中&#xff0c;精确控制速度与位置的需求日益凸显&#xff0c;这为谐波减速机的广泛应用提供了广阔的舞台。哈默纳科Harmonic谐波减速机以结构紧凑、高精度、高刚度、高可靠性、便于安装维护等优势&#xff0c;在工业机器人和自动化系统中发挥着举足轻重的作用。 一、…

C语言—内存函数

1. memcpy 使用和模拟实现 void* memcpy&#xff08;void* destination&#xff0c;const void* source&#xff0c;size_t num&#xff09;&#xff1b; 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 ‘\0’ 的时候并不…

使用 Scapy 库编写 ICMP 洪水攻击脚本

一、介绍 ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;洪水攻击&#xff08;ICMP Flood Attack&#xff09;是一种常见的网络攻击类型&#xff0c;旨在消耗目标系统的网络资源和带宽。这种攻击通过发送大量的ICMP消息给目标…