RabbitMQ------其他知识点(幂等性、优先级队列、惰性队列)(九)

news2025/4/17 4:59:41

RabbitMQ------其他知识点()(九)

幂等性

用户对于统一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用。同一次还款,通过多次点击不会生成多条还款记录,一个人的注册按钮,多次点击不会生成多条用户信息。

解决思路

MQ消费者的幂等性的解决一般使用全局ID,或者写一个唯一标识比如时间戳,或者UUID或者订单消费者MQ中的消息,也可以利用MQ的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过。

消费端的幂等性保障

业界主流的幂等性有两种操作:1.唯一ID+指纹码机制,利用数据库主键去重, 2.利用redis的原子性去实现。

唯一ID+指纹码机制

指纹码:基本上都是由业务规则拼接而成,但是一定要保证唯一性。然后利用查询语句进行判断这个id是否存在数据库中。
优势:实现简单,一个拼接加上查询判断是否重复。
劣势:高并发时,单个数据库有写入性能瓶颈,当然也可以采用分库分表提升性能。

Redsi原子性(建议使用)

利用Redis执行setnx命令(只有不存在时候才设置),具有天然幂等性,从而实现不重复消费

优先级队列

对于同样的消息,有优先级处理,优先级高的,优先处理。如果发现是一个大客户的小新,就给与比较高的优先级,否则采用默认优先级。
队列的先进先出。
消费者在获取优先级队列消息时,是先把消息进行排队,排完队再获取。
优先级队列的优先级是0-255,却大,越优先被消费。

页面配置

在管理页面中,点击Queues—》Add a new queue-----》Maxium priority
点击后,会在Arguments中,自动带入参数 x-max-pripority
可以在value,中输入0-255之间的数字,但是建议10,数字越大,排序时开销也越大。
在这里插入图片描述

代码配置

1.首先在队列的代码中添加优先级

parms.put("x-max-priority", 10)
channel.queueDeclare("hello",true,false,false,parms);

2.发消息时,设置消息的优先级。
优先级别在队列优先级的范围内。

new AMQP.BasicProperties().builder().priority(5).builder();

只有队列和消息同时设置优先级,才能够使用该功能
且 消费者需要等待消息已经发送到队列中才能够去消费,应为此时才有机会对消息进行排序。
【将需要排序的消息,全部,发送到队列中后,消费者再消费】

示例代码:
配置类中新增优先级队列

    //优先级队列
    public static final String PRIPORITY_QUEUE_NAME = "pripority_queue";
    //声明 优先级队列
    @Bean("priorityQueue")
    public Queue priporityQueue(){
        //创建队列的两种方式
        //QueueBuilder.durable(CONFIRM_QUEUE_NAME).build();
        HashMap<String, Object> arguments = new HashMap<>();
        arguments.put("x-max-priority",10);
        return  new Queue(PRIPORITY_QUEUE_NAME,true,false,false,arguments);
    }

生产者:

    //开始发消息
    @GetMapping("/sendExpirationMessage/{message}")
    public void sendPriMsg(@PathVariable String message){
        log.info("当前时间:{},发送一条消息给优先级队列:{},优先级为:{}ms",new Date().toString(),message);

        /**
         * 交换机
         * routingkey
         * message
         * Priority,可以设置存活时间
         */
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
                @Override
                public Message postProcessMessage(Message message) throws AmqpException {
                    message.getMessageProperties().setPriority(finalI);
                    return message;
                }
            };
            rabbitTemplate.convertAndSend("X","XC","优先级的队列:"+message,messagePostProcessor);
        }
        
    }

结论:可以实现优先级高的消息被优先消费。
但是也需要实现消息堆积
1.自己模拟的话,只能先启动生产者发消息,再启动消费者进行消费。
按这个思路生产上,应该是…
通过定时任务的方式开启消费者。

2.或者消费者一直启动,能否通过配置或者代码的方式,实现RabbitMQ对消息进行堆积操作?遗留问题

惰性队列

惰性队列会尽可能的将消息存入磁盘中,在消费者消费到相应的消息时,才会被加载到内存中。
使用场景:消费者下线了,宕机了或者由于维护而关闭了,导致长时间内不能消费消息时,造成堆积时,惰性队列就很有必要了。

两种模式

队列具有两种模式:default和lazy,默认的为default模式,lazy模式就是惰性队列的模式,可以通过调用channel.queueDeclare方法的时候再参数中设置。也可以通过Policy的方式设置。
两种方式都设置的话,Policy的方式具有更高的优先级。
如果通过声明的方式改变已有队列的模式的话,只能先删除队列,再重新声明一个新的。
声明方式设置:

HashMap<String, Object> arguments = new HashMap<>();
        arguments.put("x-queue-mode","lazy");
        return  new Queue(PRIPORITY_QUEUE_NAME,true,false,false,arguments);
或者
channel.queueDeclare("myqueue",false,false,false,arguments);

页面设置:
与页面设置优先级队列一样,选择Lazy mode,会自动将参数点出来。

结论:在发送1百万条消息时,每条消息大概占1KB的情况下,普通队列占用内存时1.2GB,而惰性队列仅仅占用1.5MB(因为只放在磁盘中,内存中仅存放索引)

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

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

相关文章

crm客户管理系统为企业带来的价值

简道云CRM场景套件对中小企业来说&#xff0c;crm客户管理系统最核心的作用&#xff0c;一是客户信息(联系信息和洽谈过程&#xff09;的存留&#xff0c;不会因为业务人员的离职造成流失&#xff0c;这点对老板很重要。二是可帮助业务人员&#xff08;客户获取、主管指导等&am…

Win32API操作文件

在Windows编程中CreateFile函数是用得非常多的&#xff0c;不仅可以打开文件&#xff0c;还可以打开管道、邮槽、通信资源、磁盘设备&#xff08;早期Windows)&#xff0c;控制台、目录。该函数返回一个句柄&#xff0c;该句柄可用于根据文件或设备以及指定的标志和属性访问文件…

SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式

一、 前言 本章将讨论如何使用Spring Security实现一个资源服务器&#xff0c;资源服务器是管理用户资源的组件。另外&#xff0c;学习本章有个前提&#xff0c;需要先把前面搭建授权服务器的相关文章先给阅读&#xff0c;否则可能后面出现的授权服务器相关代码不知道个所以然…

【Redis】缓存击穿的产生情况解决方案

1. 缓存击穿产生 也叫做 热点 Key 问题&#xff0c;高并发访问并且缓存重建业务较复杂的 key 突然失效了&#xff0c;无数的请求想要重建缓存&#xff0c;大量的访问会在瞬间给数据库带来巨大冲击。 2. 解决方案 2.1 方案一&#xff1a;互斥锁 查询缓存不存在时&#xff0c;…

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例路径&#xff1a; olaFlow\tutorials\baseWaveFlume 算例描述&#xff1a; 一个基础的二维波浪水槽 算例快照&#xff1a; 图1 波浪模拟结果图2 算例网格文件结构&#xff1a; ├── 0.org │ ├── U │ ├── alpha.water │ ├── alpha.water.org │ └─…

关于Redis的远程连接 Connection: Disconnect on error 问题

bug描述&#xff1a; Connection: Disconnect on error: Connection error: Connection timed outConnection: 192.168.245.128 > connection failed 问题复现&#xff1a; redis版本&#xff1a; redis-6.2.6 Linux版本&#xff1a;CenterOS 7 在linux上已经完成了red…

第五章. 可视化数据分析分析图表—常用图表的绘制1—折线图,柱形图

第五章. 可视化数据分析分析图 5.3 常用图表的绘制1—折线图,柱形图 本节主要介绍常用图表的绘制&#xff0c;主要包括折线图&#xff0c;柱形图。 1.折线图&#xff08;matplotlib.pyplot.plot&#xff09; 折线图可以显示随时间而变化的连续数据&#xff0c;适用于显示在相…

Hadoop原理与技术——hdfs命令行基本操作

一、实验目的 熟悉hdfs命令行基本操作 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内容 1&#xff1a;hdfs常见命令&#xff1a; &#xff08;1&#xff09;查看帮助&#xff1a;hdfs dfs -help &#xff08;2&#xff09;查看当前目录…

OpenCV图像处理——目标追踪

总目录 图像处理总目录←点击这里 二十四、目标追踪 24.1、多目标&#xff08;手动检测&#xff09;追踪 24.1.1、原理 目标检测&#xff1a;运行之后按下s&#xff0c;通过鼠标对某个目标进行检测&#xff0c;然后点击空格或者回车 目标追踪&#xff1a;opencv的八种追踪…

【JavaEE】JavaScript(基础语法)1

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、JavaScript初识&#xff08;简单了解就行&#xff0c;没时间跳过&#xff09;二、【JS的代码相关】【注释】【输入输出】三、语法1. 变量2. 【基本数据类型】THINK前言 一个人最大的痛苦就是对自己无能的愤…

信贷风控NCL净损失率的指标实现与应用

在金融信贷业务的风险控制过程中&#xff0c;有一项财务指标发挥着比较重要的信息参考价值&#xff0c;可以有效衡量某个月份放款金额在形成呆账后的资金损失情况&#xff0c;其中呆账指的是信贷逾期180天以上&#xff0c;这个指标便是NCL&#xff08;Net Credit Loss&#xff…

大家都在用的福昕阅读器 foxit 你还不知道吗? 祛除水印PDF转换全功能解锁…

趣味拓展 什么字大家看了都说没用&#xff1f; (答案在文末) 引言 福昕阅读器是一款高级PDF编辑器&#xff0c;查看目录、去除水印、编辑文本、转换格式等都是可以用到的~ 小编第一次使用的时候是用来查看pdf文档目录的&#xff0c;当时未使用破解版&#xff0c;后来循序渐进…

基于PHP+MySQL中小学生科学实验展示网站的设计与实现

中小学生科学实验展示网站能够通过互联网得到广泛的、全面的宣传,让尽可能多的人积极的参加到科学实验行列中来,不仅为需要的人提供了服务,而且锻炼了自己,同时能够让中小学生对科学实验的兴趣有很大的提高 PHP中小学生科学实验展示网站是一个科普类型的网站,系统通过PHp&#…

[附源码]Python计算机毕业设计SSM客户信息管理(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

模拟电子技术(四)放大电路的频率响应

&#xff08;四&#xff09;放大电路的频率响应电路理论基础知识复习频率响应基本概念两个无源频率响应的单元电路波特图&#xff08;幅频、相频&#xff09;高、低同电路对比晶体管的高频等效模型单管放大电路的频率响应研究信号频率的变化对放大电路性能的影响也就是电路对输…

Linux零基础入门(二)Linux基础命令

Linux零基础入门&#xff08;二&#xff09;Linux基础命令前言Linux基础命令一 Linux的目录结构1 Linux路径的描述方式二 Linux命令入门1 Linux命令基础格式2 ls命令3 HOME目录和工作目录4 ls命令的参数ls 命令的 -a选项ls命令的 -l选项ls命令选项的组合使用ls选项和参数的组合…

基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工势场法原理是&#xff1a;首先构建一个人工虚拟势场&#xff0c;该势场由两部分组成&#xff0c;一部分是目标点对移动机器人产生的引力场&#xff0c;方向由机器人指向目标点&#xf…

C语言——malloc开辟矩阵

目录 用动态内存开辟矩阵 矩阵初始化 用动态内存开辟矩阵 动态内存更多的知识在这篇博客&#xff0c;本文将介绍用malloc开辟矩阵。 malloc是C语言中用来动态开辟内存的&#xff0c;通过malloc函数可以向计算机申请一串连续的内存空间。 因为malloc开辟的内存在堆上&#…

数据链路层-封装成帧

封装成帧 数据链路层给上层交付的协议数据单元添加上帧头和帧尾使之成为帧帧头和帧尾包含有重要的控制信息帧头和帧尾的作用之一就是帧定界 透明传输 数据链路层对上层的交付的传输数据没有任何的限制&#xff0c;就好像数据链路层不存在一样面向字节的物理链路使用字节填充(字…

manjaro (gnome) 记录 2 常用配置与快捷键介绍

manjaro &#xff08;gnome&#xff09; 记录 2 常用配置与快捷键介绍 初manjaro 记录 2 常用配置与快捷键介绍安装 vim 文本编辑器配置中文输入法安装谷歌拼音配置输入法添加快捷键&#xff1a;gnome 终端通过命令&#xff1a;gnome-terminal 可以打开 gnome 终端窗口设置快捷…