当前位置: 首页 > news >正文

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息,但是发和收消息是只是MQ最基本的功能了,在收发消息的过程中,会有很多的问题需要去解决,下面需要学习rabbitMQ的高级特性去解决 

死信交换机:这个可以帮助我们实现消息的延迟的特性

惰性队列:可以去解决成百万更高消息堆积的问题

MQ集群:解决单点MQ的可用性问题

(一)消息的可靠性

在消息的传递过程中,凡是有消息传递,都由可能导致消息丢失,生产者者将消息传输到交换机,这个过程中有网络传输,有可能丢失。

交换机将消息路由给队列,这个过程中也有可能丢失,他们都属于在消息的发送过程中丢失,只有到达队列,队列将消息保存起来了,才算发送成功

发送成功消息并不安全,这个时候如果MQ宕机了,mq又是内存存储,一宕机内存中的数据全部都是,消息也会丢失,MQ本身也有可能把消息弄丢

前面没有问题,消息到了消费者,消费者也有可能宕机,比如说消息刚到消费者,消费者还没有处理就挂了,消息也就丢失了,消费者也有可能把消息弄丢 

(1)生产者消息确认

生产者如何保证消息不会丢失呢?

动手实现消费者确认

消费者 

生产者:

ApplicationContext是Spring的Bean容器(工厂),Aware是通知,ApplicationContextAware是Bean容器的通知,当Spring的Bean工厂准备好之后,它会来通知你

上面的代码是在Bean工厂创建完以后,代码会在项目启动后去执行,CallBack是全局的CallBack

ReturnCallback是消息到了交换机了,但是路由的时候失败了

ConfirmCallBack,是指消息没有到达交换机

在生产者代码中加:

发送消息通过单元测试发:

点击这个交换机,绑定队列:

原来简单的发送消息:是这样的:

现在要做消息确认:

Lambda表达式简化:

失败的情况:

 消息没有到交换机,网络丢包了,我们这里交换机名字填错:

还有一种情况消息成功到达交换机,没有到达队列:有很多种比如说到了交换机还没有来的及到队列的时候结果服务出现故障了,我们这里也是修改路由key写错了:这个时候肯定到达不了队列,这个时候会返回ReturnCallBack

(2)消息的持久化

生产者确认可以保证消息投递到队列当中,但是这样消息还是不安全的,RabbitMQ

默认是内存存储,此时MQ出现宕机,消息也是会丢失的 ,要想让消息真正安全,要把消息做到持久化,把消息写到磁盘当中

我们已经发送一条消息,这个时候我们重启下MQ,看看队列中的消息是否持久存在:

发现所有队列都没了 

系统自带的交换机都是存在的:

在控制台创建队列的时候可以把对列设置为持久的:

在消费者代码中添加:

启动消费者服务:

浏览器队列

交换机:

重新发送一条消息,先关掉消费者服务,不让他消费消息

浏览器发送消息:点击这个队列:

刷新页面就有消息了 

在次重启mq:

交换机队列都在:

但是消息没了:说明消息没有持久

需要设置消息持久: 

单元测试发送持久化消息:

再重新mq: 

刷新页面消息还在:

我们平常在SpringAMQP当中,队列,交换机,以及消息默认情况下都是持久的

上面的内容是告诉大家持久化怎么去做,持久化是写磁盘的,会有性能的损耗,不是所有的数据需要持久化 

(3)消费者消息确认

经过前面学习能够保证消息能够投递到消费者,但是消费者能够正常消费吗?不能的,消息投递后的那一刻消费者立马就挂了,这样消息还是没有消费,休息就丢失了,RabbbitMQ中又提供一种消费者的消费确认机制

在消费者的配置文件添加:先设置none

None模式:消息投递立即删除 

刷新浏览器:

消费者抛异常了,消息就废了,消费者这里没了,队列也没了,消息就丢失了 

改为auto模式:

先往里面发送一条消息: 

刷新浏览器:

状态变为Unacked,等待返回ack

释放断点:出现异常,它会一直重复发送消息 ,永不停止,这样不太好,需要去处理,此时消息不会丢失

(4)失败重试机制

我们通过上面设置,实现了消费者的确认机制,至少确保消息能被消费一次,只不过当消费者消费失败以后它会返回nack,这样消息会重新到 MQ的队列里,MQ再次把消息投递给消费者,如果代码没有问题,消息最终可能被消费,如果代码有问题,就会无限循环,默认的重复尝试机制是有问题的

重试的时间消息间隔倍数为三 

超过重试次数,消息就会被拒绝 

此时消息就没有了,消息就被丢弃了 

(5)消费者失败消息处理策略

消费者这里重试,不会给mq带来压力,它是在消费者本地不断的重试,这种做法有一个问题,在多次重试之后,会将消息直接丢弃,对一些普通消息来讲直接丢了无所谓,但是有一些业务中的消息很重要不能直接丢弃 ,下面是小时重试之后的处理方案

失败的消息,我们可以找一个消费者专门监听失败的消息队列,凡是失败的消息都能够被消费者拿到,这个消费者可以把这个消息发送给管理员,通知它消息失败了,这个时候可以人工去介入处理这些消息,通过这样设置就可以做到消息真正的万无一失了,从生产者到消费者,到最后还有一门兜底的方案 

发送一条消息:

在error队列中就会出现错误的异常跟消息,这样管理员就可以知道那条消息失败,和错误的原因 

相关文章:

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息,但是发和收消息是只是MQ最基本的功能了,在收发消息的过程中,会有很多的问题需要去解决,下面需要学习rabbitMQ的高级特性去解决 死信交换机:这个可以帮助我们实现消息的延迟的…...

Junit常用断言

0.断言简介 断言:assert Q:断言的作用 更方便的对结果进行判定 "有针对性"的if判断 针对两个变量值是否相同 使用assertEquals针对两个对象是否相同 使用assertSame针对返回值是否为True 使用assertTrue 1.断言的参数 assertXXX(”断言失败时提升的信息“&#x…...

docker 实现 mysql:8.3.0 主从复制(2024年2月13日最新版本)

环境为 CentOS 7.6, 具体操作请看MySQL主从复制01-主从复制概述及原理_哔哩哔哩_bilibili 1、配置主服务器 # 启动主服务器 docker run -p 3306:3306 --name mysql_master -e MYSQL_ROOT_PASSWORDnmnmnm67890890 -v /docker/mysql_master/conf:/etc/mysql/conf.d…...

STM32 + ESP8266,连接阿里云 上报/订阅数据

(文章正在编辑中,一点点地截图操作过程,估计要拖拉两三天) 一、烧录MQTT固件 ESP8266出厂时,默认是AT固件。连接阿里云,需要使用MQTT固件。 1、独立EPS8266模块的烧录方法 2、魔女开发板,板载…...

如何利用chatgpt提升工作效率?

在数字化和信息化的时代,人工智能技术已经深入到了我们生活的方方面面。其中,ChatGPT作为当前热门的人工智能技术,以其强大的自然语言处理能力和广泛的应用场景,正逐渐改变着我们的工作方式,为我们提高工作效率提供了全…...

MongoDB聚合:$geoNear

$geoNear根据指定的点按照距离以由近到远的顺序输出文档。 从4.2版本开始&#xff0c;MongoDB移除了limit和num选项以及100个文档的限制&#xff0c;如果要限制结果文档的数量可以使用$limit阶段。 语法 { $geoNear: { <geoNear options> } }$geoNear操作接受一个包含…...

Docker-CE 国内源国内镜像

Docker-CE 就是 Docker Community Edition 的意思 docker-ce由docker官方维护 , docker.io由Debian维护 Docker官文 – Install Docker Engine on CentOS Docker官文 – Install Docker Engine on Fedora Docker官文 – Install Docker Engine on Debian Docker官文 – In…...

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】&#xff08;3&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows上搭建环境&#xff0c;安装node&#xff0c;rust环境&#xff0c;可以…...

C++ 堆排序

C 堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;其原理如下&#xff1a; 构建最大堆&#xff1a;将待排序的数组看作一个完全二叉树&#xff0c;并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以…...

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…...

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…...

【数据分享】1929-2023年全球站点的逐年平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…...

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露&#xff1a; 像比如ContentProvider,BroadcastReceiver&#xff0c;Activity等组件有android:exported属性&#xff1b; 如果是私有组件 android:exported “false”&#xff1b; 如果是公有组件 android:exported “true” 且进行权限控制&…...

C#的Char 结构的像IsLetterOrDigit(Char)等常见的方法

目录 一、Char 结构的方法 二、Char.IsLetterOrDigit 方法 1.Char.IsLetterOrDigit(Char)用法 2.IsLetterOrDigit(String, Int32)方法 三、Char.IsLetter 方法 1.IsLetter(Char) 2.IsLetter(String, Int32) 四、Char.IsDigit 方法 1. IsDigit(String, Int32) 2.IsDig…...

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…...

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵 题目链接&#xff1a;1277. 统计全为 1 的正方形子矩阵 代码如下&#xff1a; class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…...

Python 3 时间序列可视化指南

简介 时间序列分析属于统计学的一个分支&#xff0c;涉及对有序的、通常是时间性的数据进行研究。当适当应用时&#xff0c;时间序列分析可以揭示意想不到的趋势&#xff0c;提取有用的统计数据&#xff0c;甚至预测未来的趋势。因此&#xff0c;它被应用于许多领域&#xff0…...

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…...

【Docker】01 Docker安装与配置

文章目录 一、Docker二、离线安装Docker三、联网安装Docker3.1 下载YUM软件库文件3.2 安装epel-release3.3 安装yum-utils3.4 设置镜像仓库3.5 查看docker-ce所有版本3.6 安装Docker3.7 启动Docker3.8 查看Docker信息3.9 启动第一个容器 四、一些配置4.1 登录DockerHub4.2 镜像…...

Unity3d Shader篇(六)— BlinnPhong高光反射着色器

文章目录 前言一、BlinnPhong高光反射着色器是什么&#xff1f;1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...