5.RabbitMQ高级特性

news2024/11/27 0:41:07

5.RabbitMQ高级特性

为什么不是RabbitMQ的事务?

这是从官网直接翻译过来的:网络可能以不太明显的方式出现故障,而且检测某些故障需要时间。因此,向套接字编写协议帧或一组帧(例如发布的消息)的客户端不能假定消息已经到达服务器并已成功处理。货物可能在运输途中丢失,或者严重延误交货。使用标准AMQP 0-9-1,保证消息不丢失的唯一方法是使用事务–使通道成为事务性的,然后对每个消息或消息集进行发布、提交。在这种情况下,事务没必要地过于重量级,从而将吞吐量降低了250倍。为了解决这个问题,引入了一种确认机制。它模仿了协议中已经存在的消费者确认机制。

1.1 消息的可靠投递

在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。

  • confirm 确认模式
  • return 退回模式

rabbitmg 整个消息投递的路径为:
producer—>rabbitmg broker—>exchange—>queue—>consumer

  • 消息从 producer 到 exchange 则会返回一个 confirmCallback。

  • 消息从 exchange–>queue 投递失败则会返回一个 returnCallback。

    我们将利用这两个 callback 控制消息的可靠性投递。

操作总结

  • 设置ConnectionFactorv的publisher-confirms="true"开启 确认模式。

  • 使用rabbitTemplate.setConfirmCallback设置回调函数。当消息发送到exchange后回调confirm方法。
    在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败,需要处理。

  • 设置ConnectionFactorv的publisher-returns=“true” 开启 退回模式。

  • 使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到queue失败后,如
    果设置了rabbitTemplate.setMandatorv(true)参数,则会将消息退回给producer。并执行回调函数 returnedMessage。

注意:主要针对生产者,发送的时候注意发送完消息让消息休眠下,不然会被关闭,无法接受反馈的信息。

1.2 Consumer Ack

ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。有三种确认方式:

  • 自动确认:acknowledge="none“
  • 手动确认:acknowledge="manual”
  • 根据异常情况确认:acknowledge="auto“

其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从
RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常那么该消息就会丢失。如果设置了手动确认方式,则需要在业务处理成功后,调用
channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。

操作总结(基于SpringMVC)

  • 在rabbit:listener-container标签中设置acknowledge属性,设置ack方式none:自动确认。 manual:手动确认

  • 如果在消费端没有出现异常,则调用channel.basicAck(deliveryTag,false);方法确认签收消息

  • 如果出现异常,则在catch中调用 basicNack或 basicReject,拒绝消息,让MQ重新发送消息。

1.3 消费端限流

在这里插入图片描述

当生产者向MQ中每秒发送5000个请求,消费端可以从connetion-factory 配置中配置一次去多少条消息。

总结:

在rabbit:listener-container 中配置 prefetch属性设置消费端一次拉取多少消息
消费端的确认模式一定为手动确认。acknowledge=“manual”

在这里插入图片描述

1.4 TTL(Time To Live)

  • TTL 全称 Time To Live(存活时间/过期时间)。
  • 当消息到达存活时间后,还没有被消费,会被自动清除。
  • RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间,
    在这里插入图片描述

注意

  • 设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。

  • 设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这一消息是否过期。

  • 如果两者都进行了设置,以时间短的为准。

1.5 死信队列

死信队列,英文缩写:DLX。Dead Letter Exchange (死信交换机),当消息成为Dead message后,可以被重新发动到另一个交换机,这个交换机就是DLX。
在这里插入图片描述

消息成为死信的三种情况:

1.队列消息长度到达限制;

2.消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;

3.原队列存在消息过期设置,消息到达超时时间未被消费;

队列绑定死信交换机:

给队列设置参数:x-dead-letter-exchange 和 x-dead-letter-routing-key ,使用场景多少分钟后去做一件事情,例如订单30分钟失效,唯品会的购物车商品2小时之后放入库存等一些定时的操作。使用时情况如下
在这里插入图片描述

总结:

1.死信交换机和死信队列和普通的没有区别

2.当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列

3.消息成为死信的三种情况:

​ 1>队列消息长度到达限制;
​ 2>消费者拒接消费消息,并且不重回队列;
​ 3>原队列存在消息过期设置,消息到达超时时间未被消费;

1.6 延迟队列

延迟队列:顾名思义,消息进入队列后不会立即被消费,只有达到指定时间后,才会被消费。

需求:

  1. 下单后,30分钟未支付,取消订单,回滚库存。
  2. 新用户注册成功7天后,发送短信问候。

实现方式:

  1. 定时器

  2. 延迟队列

在这里插入图片描述

分析:

1.定时器:实现功能没什么问题,但是我们需要每分钟的去扫描订单是否到时间,会对服务本身或数据库造成一定压力,数据少的时候影响不大;一旦过时没有执行再次执行比较困难。

2.延迟队列:可以实现同样的功能,并且可以减轻服务和数据库的压力,若MQ出问题,服务恢复之后还可以继续执行。

1.7 消息幂等性保障

幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

在MQ中指,消息多条相同的消息与得到与消费该消息一次相同的结果。将消息和数据库中添加版本号,是最好的做法之一。

实际例子操作如下:

在这里插入图片描述

1.8消息积压的情况

  • 消费者宕机积压;

  • 消费者消费能力不足积压;

  • 发送者流量太大;

    解决方式:

    1. 上线更多消费者服务;
    2. 上线专门的队列消费服务,将消息批量取出来,记录数据库,慢慢处理。

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

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

相关文章

【库存控制】基于蜜蜂算法优化库存控制附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

如何将dwg文件转成kml文件

第一步: 在CAD中将DWG另存为 DXF,如下: 注意:(中文乱码)为了打开的中文不出现乱码,保存DXF文件请选择如下的选项 第二步: 下载安装Bigemap GIS Office download.bigemap.com/bmset…

12.01 M4-UART-IT实验

1.使用CORTEX-M4核,实验中断实验和串口实验结合--->上传到CSDN 按键触发时,LED灯状态取反,并且在串口工具打印一句话 KEY1按键按下,LED1状态取反,串口工具打印key1 down!!!! 主要代码gpio.c void HAL_GPI…

C++ 语言学习 day14 复习 (6)

1.stack / queue(栈&#xff0c;队列) stack 构造函数 stack<int> v; 入栈 v.push(i); 出栈 v.pop(); 是否为空 v.empty() queue 构造函数 queue<int> v; 入队 v.push(i); 出队 v.…

下载axios时出现很多npm ERR错误:npm ERR! code ERESOLVEnpm ERR! ERESOLVE could not resolve

出现的下载错误&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolvenpm ERR! npm ERR! while resolving: vue/eslint-config-standard6.1.0npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin-vue npm ERR!dev eslint-plugin-…

毕业设计案例:Python实现疫苗接种数据库管理系统

一、序言 那一年过年前&#xff0c;疫情开始爆发&#xff0c;对全国人民的生活和工作造成了严重的影响。但凭借着国家强盛的实力&#xff0c;新冠疫苗也很快的被技术人员研发出来&#xff0c;人们通过接种新冠疫苗来抵御新冠病毒的危害。本次通过接种新冠疫苗的这个数据统计&a…

(一)正则表达式——基础概念

&#xff08;一&#xff09;正则表达式——基础概念 概括 用来处理字符串的规则。除了对象、函数&#xff0c;我们操作得最多的就是字符串 正则的两大作用&#xff1a; 验证是否匹配把匹配到的内容捕获到量词元字符*特殊元字符点. &#xff1a;除了\r \n以外的字符 普通元字符h…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

RNN/LSTM (三) 学习torchtext源码

文章目录包装dataset构建词库1.列举数据源2. 遍历数据3. 列举特殊符号4. 构建词库 Field::vocab_clsload_vectors构建读指针 data.BucketIterator在上一文&#xff0c;我们学习了基于torchtext编写lstm模型的实践案例&#xff0c;本文将结合上文案例&#xff0c;深入案例代码&a…

Python自动化之Excel利器openpyxl

文章目录前言一、Workbook1.1 读取xlsx文件1.2 保存二、Sheet2.1 创建Sheet2.2 遍历Sheet2.3 移动Sheet2.4 删除Sheet2.5 插入、删除行列三、单元格3.1 获取某个单元格3.2 遍历单元格3.3 获取范围单元格3.4 单元格赋值3.5 合并/解除合并单元格3.6 单元格数据格式3.7 单元格数字…

[附源码]Python计算机毕业设计Django儿童早教课程管理系统论文2022

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

算法设计与分析 SCAU19180 集合划分问题

19180 集合划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 教材课后习题2-8 n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如&#xff0c;当n4时&#xff0c;集合{1,2,3,4}可以划分为15个不同的非…

微信小程序开发学习文档(万字总结,一篇搞定前端开发)

一、微信小程序简介 与网页开发不同&#xff0c;小程序有自己的一套标准开发模式&#xff1a;-申请小程序开发账号-安装小程序开发工具-创建和配置小程序项目 1.1 创建第一个小程序 1.2 主界面的5个组成部分 1.3小程序项目的基本构成 pages 用来存放所有小程序的页面&#xf…

Java并发编程—Thread类中的start()方法如何启动一个线程【原理分析】?

一、java线程的介绍&#xff1a; 在java的开发过程中&#xff0c;很多铁子对于java线程肯定不感到陌生&#xff0c;作为java里面重要的组成部分&#xff0c;这里就从如何创建一个线程给大家进行分析&#xff1b; 二、相关知识引入&#xff1a; ​ 之前我了解过&#xff0c;j…

2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

2022年中职组浙江省“网络空间安全”赛项 B-1:Windows渗透测试一、竞赛时间 420分钟 共计7小时 吃饭一小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第①阶段: 单兵模式系统渗透测试 任务一: Windows操作系统渗透测试 任务二: Linux操作系统渗透测试 任务三…

[附源码]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…

segmenter

patch embedding&#xff1a;例如输入图片大小为224x224&#xff0c;将图片分为固定大小的patch&#xff0c;patch大小为16x16&#xff0c;则每张图像会生成224x224/16x16196个patch&#xff0c;即输入序列长度为196&#xff0c;每个patch维度16x16x3768&#xff0c;线性投射层…

hexo+github手把手教你部署个人博客

一、安装并配置Node.js&#xff08;原本就有安装&#xff09; 参考&#xff1a;(1条消息) Node.js安装与配置&#xff08;详细步骤&#xff09;_普通网友的博客-CSDN博客_nodejs安装配置 一、下载Node.js官网下载 安装位置与环境变量配置 系统属性-环境变量-系统变量-Path 验…

129页4万字某智慧能源集团数字化管控平台项目 建设方案

目录 数字化管控平台相关项目建议书 1 目录&#xff1a; 1 一、相关项目背景 2 二、需求理解 3 2.1 需求理解 3 三、方案设计 5 3.1 整体方案设计 7 3.3.1 整体架构 7 3.3.2 解决方案说明 8 3.3.3 需求应答 10 3.2 数据仓库 11 3.2.1 数据仓库架构 11 3.2.2 数据仓库产品说明 1…

springMVC01,【第一个springMVC例子(注解版):HelloWorld】

springMVC01,【第一个springMVC例子-注解版&#xff1a;HelloWorld】创建项目1.配置web.xml2.编写spring配置文件3.controller层3.1RequestMapping注解4.运行测试5.小结链接: springMVC01,springMVC的执行流程【第一个springMVC例子&#xff08;XML配置版本&#xff09;&#x…