RabbitMQ 高级篇 | 黑马

news2024/9/26 22:58:29

一、消息可靠投递

生产端的

在使用 RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。

RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。

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

rabbitmq整个消息投递的路径为:

producer--->rabbitmq broker--->exchange--->queue--->consumer

  • 消从 producer到exchange 则会返回一个confirmCallback
  • 消息从 exchange-->queue 投递失败则会返回一个returnCallback

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

confirmCallback 

returnCallback 

二、Consumer Ack

消费端的

ack指acknowledge,确认。表示消费者接收到消息后的确认方式

三种:

  • 自动确认: acknowledge="none
  • 手动确认:acknowledge="manual
  • 根据异常情况确认:acknowledge="auto"(这种方式使用麻烦,不作讲解)

自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 mesage 从 RabbitMQ的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。

如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck0,手动签收,如果出现异常,则调用channel.basicNack0方法,让其自动重新发送消息。

1、自动确认

什么都不配置默认就是自动确认

2、手动确认

实现的不是messagelistener而是他的子接口,然后开启手动确认

3、小结

三、限流 

这样配置的话就是代表用了手动接收,然后每次只接收一条消息,手动确认之后才有下一条,如果去掉prefetch=“1”,那么一次就会把消息全部拉过来

在<rabbit:listener-container>中配置 prefetch属性设置消费端一次拉去多少消息
消费端的确认模式一定为手动确认,acknowledge="manual"

四、TTL

Time to Live(存活时间/过期时间)

当消息到达存活时间后,还没有被消费,会被自动清除

RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间

1、队列统一过期

配置好队列和交换机,设置好队列的过期时间 10秒

队列过期后,会统一的把全部消息都删除掉

消息过期后,只有消息在队列顶端,才会判断其是否过期然后马上删除,如果不是队列顶端的,只有消息被用到前才会判断是否过期,跟redis的惰性删除很像

2、消息单独过期

写完然后把这个匿名内部类当参数传入covertandsend里面: 

如果设置了消息的过期时间,也设置了队列的消息时间,以时间短的为主 

3、小结

  • 设置队列过期时间使用参数: -message-ttl,单位: ms(毫秒),会对整个队列消息统一过期
  • 设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时 (消费时),会单独判断这一消息是否过期。
  • 如果两者都进行了设置,以时间短的为准

五、死信队列

别的mq没有exchange所有叫死信队列,但rabbitMQ有exchange所以也叫死信交换机

死信队列,DLX。Dead letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机交DLX

如果一个消息过期了,没有被正常消费,如果绑定了死信队列,不会被丢弃而是发到死信交换机上重新发送给另一个队列,也可以绑定消费者。

什么消息会变死信(重点)

  • 队列消息长度达到限制
  • 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false
  • 原队列存在消息过期设置,消息到达超时时间未被消费

队列绑定死信交换机:

给队列设置参数:x-dead-letter-exchange和x-dead-letter-routing-key

第一个参数就是设置死信交换机的名称,第二个参数就是死信队列绑定的routingkey

六、延迟队列

场景:现在要求用户下单之后,如果30分钟未支付,取消订单,回滚库存,支付了就不操作

实现方式:定时任务(不够优雅),延迟队列

RabbitMQ中未提供延迟队列的功能

但是,我们可以通过 TTL+DLX(死信队列)的方式来实现延迟队列的效果

我们可以定义一个队列过期时间为30分钟,绑定个死信交换机,然后没有消费者监听死信队列,不监听正常队列,就等他过期,过期了就会发送到私信交换机,死信交换机再发送给消费者。

七、优先级队列

优先级队列是按照优先级来优先执行,而不是按先进先出的顺序

 

八、惰性队列

惰性队列:消息保存在磁盘中,正常的队列是把消息存放在内存中

场景:当消费者宕机或者处于维护状态,导致长时间内不能消费而造成堆积的时候,惰性队列就很有必要了。

惰性队列的性能会比较低,占用内存很小。

九、应用问题

1、消息补偿机制

需求:要100%保证消息发送成功

首先生产者先把数据入库然后发送消息到队列1,如果消费者成功接收也入库,消费者接收到还要发送确认消息到队列2。生产者还会延迟发送消息给队列3,队列3和队列2的消息都会被监听到回调检查服务,如果他们的消息是不同的,队列3消息监听到发现2不在里面说明没有发成功,调用producer重新发送。如果发送消息和延迟发送都失败怎么办?还有个定时任务去定时检查回调数据库,看是否有数据没用就调用hseng

2、幂等性的保障

幂等性指的是一次或多次请求某一个资源,对于一个资源本身一个有相同的结果。

既任意多次执行对资源本身所产生的的影响均与一次的影响相同

MQ中:消费多条相同的消息,得到与消费改消息一次相同的结果

比如说我买东西画了500块,但是因为某些原因mq发了两条消息,要保证账户只扣500元

我们发消息的时候版本是1,重复发消息还是会是1多次发送还是1,但是我们只要有一个成功了,我们数据库的版本就会变成2,这样就算第二次1版本过来也和更新完的版本2不一样了失败。保证了幂等性。

 

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

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

相关文章

HCIP-6.6BGP配置中IGP路由表和BGP路由表、IP路由表关系

BGP配置中IGP路由表和BGP路由表、IP路由表关系1、基础配置2、配置建立IBGP对等体3、配置EBGP对等体4、使用network命令宣告路由5、路由的学习5.1、R2的路由表5.2、R1的BGP路由表5.3、R3的BGP路由表5.4、R5的BGP路由表6、AS200与AS100通信6.1、AS200出接口注入AS100IP路由表6.2、…

Go 汇编详解

动手点关注干货不迷路前言我们知道 Go 语言的三位领导者中有两位来自 Plan 9 项目&#xff0c;这直接导致了 Go 语言的汇编采用了比较有个性的 Plan 9 风格。不过&#xff0c;我们不能因咽废食而放弃无所不能的汇编。1、 Go 汇编基础知识1.1、通用寄存器不同体系结构的 CPU&…

【Docker】使用Docker Compose部署项目

目录 前言 使用 前言 如果你部署项目需要很多个容器, 并且还是在手动一个一个启动的话来试试Docker Compose, 只需要写好Docker Compose文件运行命令就能帮你一次性全启动, 对微服务很友好啊~ 使用 运行以下命令查看是否有版本号, 确保你已经安装了Docker Compose docker…

使用sealos工具部署k8s

为什么使用sealos工具&#xff1a;简单、快、完全兼容 k8s、给100年认证 sealos使用最新版本&#xff1a; 官网&#xff1a;https://www.sealyun.com/ 码&#xff1a;https://github.com/labring/sealos 官方介绍什么是sealos Sealos 是以 kubernetes 为内核的云操作系统发行版…

精彩回顾|4.8 Beijing Rust Meetup

2023年4月8日&#xff0c;达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust X的meetup。开发者们不仅线下积极报名参与&#xff0c;更在线上直播中踊跃参与互动&#xff0c;一起探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用和实践。演讲者与…

从EXCEL BOM 描述中提取部分信息---正则表达式使用

从EXCEL BOM描述中提取关键的信息&#xff0c;用于建库填写内容&#xff0c;或者检查BOM等都会用到&#xff0c;如下大概通过两种方式实现信息的提取 1.手动Excel中提取 2.将如上1的方式用python实现&#xff0c;可以实现批量操作&#xff0c;减少操作带来的错误&#xff0c;…

[网络安全]第三次作业

目录 1. 什么是IDS&#xff1f; 2. IDS和防火墙有什么不同&#xff1f; 3. IDS工作原理&#xff1f; 4. IDS的主要检测方法有哪些详细说明&#xff1f; 5. IDS的部署方式有哪些&#xff1f; 6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f;例外签名…

温故c语言——深度剖析数据在内存中的存储

目录 数据类型详细介绍整形在内存中的存储&#xff1a;原码、反码、补码大小端字节序介绍及判断浮点型在内存中的存储解析 1. 数据类型介绍 基本内置数据类型有&#xff1a; //在内存中占用空间的大小 char //字符数据类型 占用1个字节 short //短整型 占用2个…

linux及openEuler破解root密码

第一步&#xff1a;开机的时候按键盘的字母 E 键&#xff0c; 进入引导模式 第二步&#xff1a;进入引导模式 &#xff1a;找到linux这一行&#xff0c;按键盘上的end 键&#xff0c;跳转到行尾&#xff0c;输入&#xff1a; init/bin/sh 修改完后&#xff0c;按键盘上的 ctr…

电脑开机出现英文字母开不了机U盘重装系统教学

电脑开机出现英文字母开不了机U盘重装系统教学。有用户电脑开机之后出现了错误代码字母&#xff0c;无法正常的开机了。遇到这个问题要怎么去进行系统的重新安装呢&#xff1f;一起来看看以下的具体解决方法教学吧。 准备工作&#xff1a; 1、U盘一个&#xff08;尽量使用8G以上…

基于LS1028 TSN时间敏感网络交换机方案(一)TSN介绍

2.1 时间敏感网络介绍 时间敏感网络小组的前身是 AVB &#xff0c;即以太网音视频桥接技术&#xff08; Ethernet Audio/Video Bridging, 简称 Ethernet AVB &#xff09; [10] 。它在传统以太网络的基础上&#xff0c;通过 精确时钟同步、预留带宽、流量整形&#xff0…

Spring和IDEA都不推荐用的@Autowired注解,为什么还有那么多人用?

Autowired的默认装配 我们都知道在spring中Autowired注解&#xff0c;是用来自动装配对象的。通常&#xff0c;我们在项目中是这样用的&#xff1a; package com.sue.cache.service;import org.springframework.stereotype.Service;Service public class TestService1 {publ…

今天面了个京东拿 38K 出来的,让我见识到了基础的天花板

今年的春招已经开始了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的软件测试面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0…

ChatGPT接入Siri(保姆级教程)

ChatGPT接入Siri&#xff08;保姆级教程&#xff09;第一步&#xff1a;获取OpenAPI的Key第二步&#xff1a;制作快捷指令今天&#xff0c;我将为大家分享如何将GPT应用集成到苹果手机的Siri中&#xff08;当然手机是需要魔法&#xff08;TZ&#xff09;的&#xff09; 第一步…

协议篇之UART协议

协议篇之UART协议一、写在前面二、UART协议简介三、UART协议数据帧结构3.1 UART发送过程3.2 UART接收过程四、UART传输速率五、写在最后一、写在前面 由于设计需要&#xff0c;需要入门学习一下UART协议。本文主要学习UART协议的数据帧结构。 二、UART协议简介 通用异步收发传…

AutoGPT自主AI正在路上#趋势:自主人工智能、人机交互、终身学习

hi&#xff0c;大家好&#xff0c;我是shadow。今天分享一些我看到的人工智能正在发生的趋势&#xff0c;以及创新的机会。一些动态经过几个月的筹备&#xff0c;慢慢地我会开启2023的Mixlab故事&#xff0c;可查看公众号菜单栏里的2023专栏。本周六和下周六我将在上海的活动分…

Thingsboard开源物联网平台智慧农业实例快速部署教程(三)【源码部署及logo更换】

Thingsboard源码安装并更换logo 文章目录Thingsboard源码安装并更换logo1. 源码拉取2. 导入项目3. 项目编译4. 项目启动5. 修改logo6. 部署&#xff08;rpm deb方式&#xff09;1. 源码拉取 本教程按照3.4发行版本行进 git clone https://github.com/thingsboard/thingsboard…

深入拆解 Java 虚拟机-打卡|01 | Java代码是怎么运行的?

文章目录Java代码是怎么运行的&#xff1f;几个为什么为什么在虚拟机中运行&#xff1f;Java 虚拟机具体又是怎样运行 Java 代码的呢?Java虚拟机的运行效率怎么样&#xff1f;总结Java代码是怎么运行的&#xff1f; 来来来&#xff0c;运行个"Hello word !“告诉我是怎么…

免费的VR全景网站是什么?免费VR全景网站有什么用?

虚拟现实&#xff08;VR&#xff09;技术的应用日益广泛&#xff0c;尤其是在旅游、教育等领域。免费VR全景网站是一个新兴的平台&#xff0c;为用户提供了一个全新的探索未知世界的方式。 一、介绍免费VR全景网站的特点 1.全景视角 免费VR全景网站提供了360度全景视角&#…

Spring事务原理、隔离性

1、什么是事务 事务是指将一系列数据操作捆绑成为一个整体进行统一管理&#xff0c;如果某一事务执行成功&#xff0c;则在该事物中进行的所有数据更改均会提交&#xff0c;成为数据库中的永久组成部分&#xff1b;如果事务执行时遇到错误且必须取消或回滚&#xff0c;则数据将…