RabbitMQ:基础篇

1.RabbitMQ是高性能的异步通讯组件

何为异步通讯

        打电话就是同步通讯,微信聊天可以理解为异步通讯,不是实时的进行通讯:时效性差。

同步调用的缺点:

拓展性差(需求不尽提)

性能下降        

级联失败

优势:时效性强,等到结果再返回

异步调用

异步调用是基于消息通知形式实现,一般包含三个角色:消息发送者 消息代理 消息接收者

消息代理:负责管理转存转发消息

优势:解除耦合,拓展性强

无需等待,性能好

故障隔离

缓存消息、削峰填谷

缺点:不能立即得到结果

不确定下游服务是否成功

依赖某一个业务

技术选型

2.RabbitMQ基本介绍

MQ整体架构及核心概念

  • publisher:消息发送者

  • consumer:消息的消费者

  • queue:队列,存储消息

  • virtual-host:虚拟主机,起到数据隔离作用

  • exchange:交换机,负责路由消息

3.数据隔离

在MQ中创建虚拟主机实现数据隔离

4.SpringAMQP

AMQP:消息通信协议与语言无关,更符合微服务中独立性的要求

Spring AMQP:基于AMQP协议定义的API规范,提供模板来发送和接受消息。->spring rabbit默认实现

AMQP依赖:父工程加入依赖

配置文件:每个微服务端引入MQ服务的信息

发送消息:RabbitTemplate.converAndSend(队列名,消息体内容)

消息接受:

4.1 WorkQueue

实现一个队列绑定多个消费者

默认情况下,RabbitMQ会将消息依次轮询投递给绑定在队列上的每一个消费者,但并不会考虑消费者是否处理完消息,可能会出现消息堆积

可以通过修改配置文件,设置preFetch为1,确保同一时刻最多传递给消费者1条消息

Work模型的使用:

1.多个消费者绑定到一个队列,可以加快消息的处理速度

2.同一条消息只会被一个消费者处理

3.通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

4.2 Fanout交换机

fanout的交换机会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式

交换机的作用:

接收生产者发送的消息

将消息按照规则路由到与之绑定的队列

Fanout交换机会将消息路由到每个绑定的队列

4.3 Direct交换机

Direct交换机会将接受到的消息根据规则路由指定的queue,因此称为定向路由

每一个queue都与exchange设置一个BindingKey

发布者发送消息时,指定消息的RoutingKey

Exchange将消息路由到 BKey和Rkey一致的队列

 生产者:

4.4 Topic交换机

与Direct交换机类似,区别在于routingKey可以是多个单词的列表,并且以.分割

queue与exchange指定bindingKey时,可以使用通配符:

*:代指一个单词;#:代指0个或多个单词

描述二者差异:

direct的routingKey必须是具体topic可以是多个单词,用.分割,并且队列与交换机绑定时的routingkey可以使用通配符

4.5 用java代码声明队列和交换机

SpringAMQP提供几个类,用来声明队列、交换机及其绑定关系

代码demo:

除了上述基于Bean形式声明队列和交换机还有一种方便的方式:

4.6 消息转换器

Spring的对消息对象的处理是由MessageConverter来处理的,而默认实现是simpleMessageConverter,基于JDK的ObjectOutputStream

有几个问题:

  • JDK的序列化有安全性问题
  • JDK序列化的消息太大
  • JDK序列化的消息可读性差

推荐使用JSON序列化代替默认的JDK序列化:

publisher和consumer都要引入jackson依赖

publisher和consumer配置messageConverter

5.消息传输可靠性

5.1 生产者可靠性

5.1.1 生产者重连

利用重试机制可有效提高消息发送的成功率,不过SpringAMQP提供的重试机制是阻塞式的重试,线程是被阻塞的,会影响到业务性能

5.1.2 生产者确认

原理:

代码具体实现:

在生产者微服务中添加配置:

每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配置:

Confirmcallback 发消息

demo:

  • 生产者确认需要额外的资源,尽量不使用
  • 如果一定使用,无需开启Publisher-Return机制,因为一般路由失败是业务问题
  • 对于nack消息可以有限次重试,依然失败则记录异常信息

5.2 MQ的可靠性

5.2.1 数据持久化

在默认情况下,RabbitMQ会将收到的信息保存到内存中以降低消息收发的延迟。这样会导致俩个问题:

  • 一旦MQ宕机,内存的消息就会丢失
  • 内存空间有限,消费者发生故障或处理过慢,会导致消息积压,引发MQ阻塞

实现数据持久化:

交换机持久化
 队列持久化

 消息持久化

5.2.2 Lazy Queue

从MQ3.6.0版本之后,引入懒惰队列的概念,懒惰队列的特征:

1、接收到消息不保存到内存中,而是存入磁盘(内存只保留最近的消息,默认是2048条)

2、消费者要消费信息时才会从磁盘读取消息

3、支持百万级别的消息存储

3.12版本之后队列只有懒惰队列,无法更改

配置方法:
 

5.3 消费者的可靠性

为了确认消费者是否成功处理消息,MQ提供了消费者确认机制,当消费者处理消息结束后,应该向MQ发送一个回执,告知自己的消息处理状态。回执有三种:

ack、nack、reject

5.3.1 消费者确认机制

SpringAMQP已经实现了消息确认功能,通过配置文件选择ACK处理方式:

 5.3.2 消费失败处理
失败重试机制:

当消费者出现异常后,消息会不断requeue到队列,再重新发送给消费者,无限循环,导致MQ的消息处理飙升,带来不必要的压力

失败消息处理策略:

在开启重试模式后,重试次数耗尽,需要MessageRecoverer接口来处理

消费者如何保证消息一定被消费

开启消费者确认机制为Auto,由Spring确认消息并返回ack或者其他;

开启失败重传机制后,并设置了MessageRecoverer,多次重传失败后将消息投递给指定的交换机

5.3.3 业务幂等性

同一个业务,执行一次或多次对业务状态的影响是一致的

天生幂等业务:查询业务、删除业务

唯一消息id

源码:

第二种方案就是根据业务实现:

比如说修改订单状态,想要从已支付变成未支付的情况下,可以不用设置uuid,而是在改状态前加一个判断状态的实现就可以了。


6. 延迟消息

生产者发送消息时指定一个时间,消费者不会立刻收到消息而是等待时间之后才收到消息

6.1 死信交换机

如果一个队列通过dead-letter-exchange属性指定了一个交换机,那么该队列中的死信就会指定给这个交换机,这个交换机就是死新交换机

使用场景:

控制台实现绑定死信交换机

发送消息:需要用到消息后置处理器要不然抛异常~

消费者

6.2 延迟消息插件

MQ官方推出一个插件,原生支持延迟消息功能。其原理是设计一种支持延迟消息功能的交换机,当消息投递给交换机后可以暂存一定时间,到期后再投递给交换机。

装好插件之后,交换机加参数:

发送消息实现:

6.3 取消超时订单

首先来说这个延迟消息的发送时间的确定是根据具体业务实现,就比如说针对取消超时订单的场景下,用户支付确认之后有30min的时间进行支付,那么我们可以设置一个数组,每个数组的元素就是延迟消息,第一个是10s、10s、10s、30s、30s、1min.....这样的形式来优化延迟消息的发送。

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

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

相关文章

带你轻松玩转DevOps

一、DevOps详细介绍 软件开发最开始是由两个团队组成: 开发计划由**开发团队**从头开始设计和整体系统的构建。需要系统不停的迭代更新。**运维团队**将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。 这两个看似目标不同的团队,需要协同完…

HarmonyOS 开发者联盟高级认证最新题库

本篇文章包含 Next 版本更新后高级认证题库中95%的题目。 答案正确率 50-60%,答案仅做参考。 请在考试前重点看一遍题目,勿要盲目抄答案。 欢迎在评论留言正确答案和未整理的题目。 1、下面关于方舟字节码格式PREF_IMM16_v8_v8描述正确的是 16位前缀操作…

dp or 数学问题

看一下数据量&#xff0c;只有一千&#xff0c;说明这个不是数学问题 #include<bits/stdc.h> using namespace std;#define int long long const int mo 100000007; int n, s, a, b; const int N 1005;// 2 -3 // 1 3 5 2 -1 // 1 -2 -5 -3 -1 int dp[N][N]; int fun…

算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

前言 二叉树篇继续。 记录 四十九【112. 路径总和】和【113. 路径总和ii】 一、【112. 路径总和】题目阅读 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 target…

django-ckeditor富文本编辑器

一.安装django-ckeditor 1.安装 pip install django-ckeditor2.注册应用 INSTALLED_APPS [...ckeditor&#xff0c; ]3.配置model from ckeditor.fields import RichTextFieldcontent RichTextField()4.在项目中manage.py文件下重新执行迁移&#xff0c;生成迁移文件 py…

R语言模型评估网格搜索

### 网格搜索 ### install.packages("gbm") set.seed(1234) library(caret) library(gbm) fitControl <- trainControl(method repeatedcv,number 10,repeats 5) # 设置网格搜索的参数池 gbmGrid <- expand.grid(interaction.depth c(3,5,9),n.trees (1:2…

轨道交通AR交互教学定制公司优选深圳华锐视点

在寻找上海AR开发制作公司作为合作伙伴的过程中&#xff0c;选择一家既技术深厚又具备丰富经验的AR开发企业&#xff0c;成为了众多客户与合作伙伴的共同追求。华锐视点上海AR开发制作公司作为业界的佼佼者&#xff0c;凭借其卓越的公司规模、丰富的行业案例以及顶尖的ar增强现…

Unity基础调色

叭叭叭 最近&#xff08;*这两天&#xff09;因为想做一些Unity的调色问题&#xff0c;尝试原文翻译一下&#xff0c;其实直接原文更好&#xff01;&#xff01; Color Grading 参考了&#xff0c;某大牛的翻译&#xff0c;实在忍不住了&#xff0c;我是不知道为什么能翻译成…

OpenSceneGraph学习笔记

目录 引言第一章&#xff1a;OSG概述一、前言&#xff08;1&#xff09;为什么要学习OSG?&#xff08;2&#xff09;OSG的组成&#xff08;3&#xff09;OSG的智能指针&#xff08;4&#xff09;OSG的安装编译 二、第一个OSG程序&#xff08;1&#xff09;Hello OSG程序&#…

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

Linux热键,shell含义及权限介绍

君子忧道不忧贫。 —— 孔丘 Linux操作系统的权限 1、几个常用的热键介绍1、1、[Tab]键1、2、[ctrl]-c1、3、[ctrl]-d1、4、[ctrl]-r 2、shell命令以及运行原理3、权限3、1、什么是权限3、2、权限的本质3、3、Linux中的用户3、4、Linux中文件的权限3、4、1、快速掌握修改权限的…

vue引用js html页面 vue引用js动态效果

要引用的index.html页面&#xff1a;&#xff08;资源来自网络&#xff09;在pubilc下建一个static文件放入js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>数字翻转</title><meta con…

速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步&#xff1a;下载软件&#xff0c;在HBase官网下载最新版&#xff0c; 找到 bin&#xff0c;点击下载&#xff0c;比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步&#xff1a;解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.…

Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性&#xff0c;易调用性、泛化性和还原性&#xff0c;任何一个lora只能完美满足其中的两项&#xff1b; 易调用性&#xff1a;在已调用lora后&#xff0c;还需要多少提示词才能让该lora完全生效&#xff1b; 泛化性&#xff1a;能不能还原lora训练素…

杜甫很 忙

我 我希望大家别再乱搞了

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器&#xff08; S S H V S c o d e &#xff09; \huge{Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09;} Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09; 文章目录 写在前面通过SSH远程连接L…

golang程序性能提升改进篇之文件的读写---第一篇

背景&#xff1a;接手的项目是golang开发的&#xff08;本人初次接触golang&#xff09;经常出现oom。这个程序是计算和io密集型&#xff0c;调用流量属于明显有波峰波谷&#xff0c;但是因为各种原因&#xff0c;当前无法快速通过serverless或者动态在高峰时段调整资源&#x…

「邀您参会」首个中国可观测日即将盛大开幕

在云计算领域不断探索与创新的背景下&#xff0c;亚马逊云科技与观测云今日宣布&#xff0c;将联合举办中国可观测日&#xff08;Observability Day&#xff09;活动&#xff0c;旨在深化双方合作&#xff0c;共同推动中国可观测性的发展。 中国站首站&#xff0c;选址上海&am…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

【启明智显方案分享】工业级HMI芯片MODEL3\MODEL4应用于电梯系统多媒体

一、方案概述 本方案采用工业级HMI芯片MODEL3或MODEL4作为核心处理器&#xff0c;结合7寸以上高清显示屏&#xff0c;为电梯系统提供多媒体解决方案。该方案不仅能够显示日期、时间、楼层信息等基础信息&#xff0c;还能播放广告、通知、视频等多媒体内容&#xff0c;增强电梯…