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版本开始,MongoDB移除了limit和num选项以及100个文档的限制,如果要限制结果文档的数量可以使用$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,视频地址: https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以…...
C++ 堆排序
C 堆排序 堆排序是一种基于二叉堆数据结构的排序算法,其原理如下: 构建最大堆:将待排序的数组看作一个完全二叉树,并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以…...

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

监测Nginx访问日志502情况后并做相应动作
今天带大家写一个比较实用的脚本哈 原理: 假设服务器环境为lnmp,近期访问经常出现502现象,且502错误在重启php-fpm服务后消失,因此需要编写监控脚本,一旦出现502,则自动重启php-fpm服务 场景: 1…...

【数据分享】1929-2023年全球站点的逐年平均风速(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…...

Android性能调优 - 应用安全问题
Android应用安全 1.组件暴露: 像比如ContentProvider,BroadcastReceiver,Activity等组件有android:exported属性; 如果是私有组件 android:exported “false”; 如果是公有组件 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】
在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子:在为北美顶级金融服务公司之一设计对话式人工智能助手时,WillowTree 的数据和人工智能研究团队 (DART) 发现,将意图分类与大型语言模型 (LLM) 结合…...
1277. 统计全为 1 的正方形子矩阵
1277. 统计全为 1 的正方形子矩阵 题目链接:1277. 统计全为 1 的正方形子矩阵 代码如下: class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…...
Python 3 时间序列可视化指南
简介 时间序列分析属于统计学的一个分支,涉及对有序的、通常是时间性的数据进行研究。当适当应用时,时间序列分析可以揭示意想不到的趋势,提取有用的统计数据,甚至预测未来的趋势。因此,它被应用于许多领域࿰…...

[算法前沿]--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高光反射着色器是什么?1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...