RabbitMQ总结

news/2024/5/7 3:55:51/文章来源:https://blog.csdn.net/lalajh/article/details/127085926

一、简介

什么是 MQ

MQ = Message Queue = 消息队列

消息队列:存放内容是消息的 FIFO(先入先出) 队列。是一种跨进程的通信机制,用于上下游传递消息。

为什么要用 MQ ?作用

1、应用解耦

电商系统为例,应用中有订单系统、库存系统、物流系统、支付系统。当用户创建一个订单时,如果耦合地调用库存、物流、支付系统,当某个系统出现故障,都会导致下单操作异常。但如果转变为基于消息队列方式后,问题就会减少很多,比如如果物流系统发送故障,需要几分钟来修复。在这段时间内,物流系统要处理地内存会被缓存在消息队列中,用户地下单操作可以正常完成。等物流系统恢复后,会继续处理订单信息,而这个过程用户感受不到物流系统出现了异常。

2、异步处理

举个例子,有两个系统 A 和 B。假如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完毕,以前一般有两种方式处理:一是 A 过一段时间去调用 B 的查询 api 。二是 A 提供一个 callback 接口,当 B 处理完时调用该接口通知 A 服务。但这两种方式都不是很优雅。使用消息队列后,可以这样做,A 调用 B 的服务后,只需要监听 B 处理完的消息,当 B 处理完后,会发送一条消息给 MQ,MQ 会将该消息发送给 A 服务。

3、流量消峰

举个例子,假如一个系统一秒最多可以处理一千次订单,这个处理能力在正常时段是绰绰有余的。但是在高峰的时候(例如双十一),一秒钟能达到五千次请求,这时候系统是处理不了这么多的,传统的方法是限制当请求超过一千之后不允许用户下单。而使用消息队列的话可以做为缓冲,把一秒内处理的订单分成一段时间来处理,当然这会影响到用户响应时间,但是比起不能下单的体验要好很多。

 削峰填谷

 MQ分类?

ActiveMQ
优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,不容易丢失数据。
缺点:官方社区维护越来越少,高吞吐量场景较少使用。

Kafka:
优点:为大数据而生,吞吐量高,多运用于大数据领域的实时计算和日志采集场景。
缺点:社区更新较慢。

RokectMQ:
优点:Java 语言实现,单机吞吐量十万级,支持 10 亿级别的消息堆积。
缺点:支持的客户端语言不多。

RabbitMQ:
优点:一个在 AMQP (高级消息队列协议)基础上完成的,主流的消息中间件之一,erlang 语言实现的高并发特性,吞吐量到万级,支持多种语言,社区活跃度高。
缺点:商业版收费。
 

二、RabbitMQ

2.1 简介

概念:RabbitMQ 是一个消息中间件,负责接收、存储、转发消息。类似生活中的快递站,负责接受快递,存储快递,转发快递。

组成:
生产者:负责产生数据
交换机:接收来自生产者的消息,并将消息推送到队列中。决定消息是要推送给特定队列,还是推送给多个队列,还是丢弃。
队列:存储消息。
消费者:接收消息。

 2.2 六大模式

1、简单模式
2、工作模式
3、发布/订阅模式
4、路由模式
5、主题模式
6、发布确认模式

 简单模式

在这里插入图片描述

  1. 消息产生着§将消息放入队列
  2. 消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)应用场景:聊天(中间有一个过度的服务器;p端,c端)

 work工作模式(资源的竞争)

在这里插入图片描述 

  1. 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)
  2. 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)

publish/subscribe发布订阅(共享资源)

在这里插入图片描述 

  1. X代表交换机rabbitMQ内部组件,erlang 消息产生者是代码完成,代码的执行效率不高,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费
  2. 相关场景:邮件群发,群聊天,广播(广告)

routing路由模式

在这里插入图片描述

  1. 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
  2. 根据业务功能定义路由字符串
  3. 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;

topic 主题模式(路由模式的一种)

在这里插入图片描述

  1. 星号井号代表通配符
  2. 星号1个字符井号代表0个或多个字符
  3. 路由功能添加模糊匹配
  4. 消息产生者产生消息,把消息交给交换机
  5. 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

2.3 死信队列

什么是死信

死信:无法被消费的消息。
死信队列:无法被消费的消息将被流转到该队列。

producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列

应用场景:

为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息
消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效。

产生死信的原因

1、消息 TTL 过期
2、队列达到最大长度(队列满了,无法再添加数据到 mq 中)
3、消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false

死信架构图

2.4 延迟队列

什么是延迟

在上节的死信队列案例中有一种情况是消息 TTL 过期,从而消息进入死信队列的过程。这种过程单独列出来就叫做延迟队列。

延迟队列:延时队列就是用来存放需要在指定时间被处理的元素的队列。即生产者正常发消息到队列,在队列中经过一定的延迟时间后进入死信队列,从而再被消费者消费。

延迟队列使用的场景有很多:
1、订单在十分钟之内未支付则自动取消
2、新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
3、用户注册成功后,如果三天内没有登陆则进行短信提醒。
4、用户发起退款,如果三天内没有得到处理则通知相关运营人员。
5、预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。
————————————————
版权声明:本文为CSDN博主「执章学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/PaperJack/article/details/124734987

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

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

相关文章

玻色量子荣获第二届“率先杯”未来技术创新大赛“决赛优胜奖”

​9月22日至23日,由中国科学院、深圳市人民政府联合主办的第二届“率先杯”未来技术创新大赛决赛在深圳、北京两地以“线上线下结合”的形式成功举办。大赛组委会办公室秘书处组织专家按照《大赛评审方案》对进入决赛的项目进行评审,经择优遴选&#xff…

vue3项目创建并运行

vue搭建 准备环境 npmnodewebpackvs code npm 使用brew命令行进行下载安装指定版本: brew install npm查看版本号: $ npm -v 8.15.0Node 进入官网nodejs,根据自己电脑的版本进行下载安装,如果是mac电脑,可以直接…

分布式文件存储系统MinIO笔记

文章目录一、MinIO介绍1、文件系统应用场景2、MinIO介绍3、MinIO优点4、MinIO的基础概念5、纠删码EC(Erasure Code)6、存储形式7、存储方案二、Minio环境搭建1、介绍2、单机部署2.1 单机部署2.2 基于Linux部署2.3 基于docker部署(推荐)3、minio 纠删码模…

塑料划分PP PE PS PA ABS PVC

**PET(聚酯)代号1, **又叫涤纶树脂,原料呈乳白色或浅黄色,透明性好,无毒,具有密度高,硬度高,耐磨损,但不耐热水侵泡,不耐碱等特点,使…

2022年暨南大学计算机830真题

学科、专业名称:网络空间安全 研究方向:网络空间安全083900 考试科目名称及代码:数据结构830 考生注意:所有答案必须写在答题纸(卷)上,写在本试题上一律不给分。 一、 单项选择题 (每题2分,共20分) 下列程…

[python刷题模板] 珂朵莉树 ODT (基于支持随机访问的跳表

[python刷题模板] 珂朵莉树 ODT (基于支持随机访问的跳表) 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码0. 区间推平(lg),单点询问(lg) CF292E. Copying Data1. 区间推平,区间询问最小值2. 区…

Unity Lighting 面板的参数设置用途详细总结

一、Environment 环境光 二、Scene 1、如果选择生成LightMap 要关闭实时光,开启烘培光 lighting mode为Mixed时,lighting settings的Mixed Lighting可用于设置混合的方式:Baked Indirect mode提供最高质量的光照,其设置只牵扯间…

windows环境下elasticsearch使用教程

windows环境下elasticsearch使用教程如下: 一、首先安装jdkElasticSearch是基于lucence开发的,lucence是apache开发的,因此ElasticSearch运行环境就需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&…

HAPPE+ER:一款让脑电研究人员“更快乐”的软件,可用于事件相关电位(ERP)分析的标准化预处理管道

导读 事件相关电位(ERP)设计是用脑电图(EEG)检测神经认知功能的常用方法。然而,传统的ERP数据预处理方法是手动编辑,这是一个主观且耗时的过程。最近创建了许多自动化通道,以满足EEG数据预处理的标准化、自动化和量化的需求;然而…

知识经济时代的基石:知识协同

管理学家彼得德鲁克(1994)指出:“企业管理的本质不在于技术与程序,而在于使知识有效。”在知识占主导地位的社会里,企业依靠知识进行创新的能力代表了企业在竞争中的优势,也是企业成功与否的标志。 世界变…

C++——string的封装

参考string类完成my_string类 #include <iostream> #include<cstring> using namespace std; class my_string { private:char *str;int len; public://无参构造my_string(){len 15;str new char[len];cout<<"无参构造"<<endl;}//有参构造…

IDEA通过原型(骨架)创建MavenJavaWeb项目

IDEA通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目 目录IDEA通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目一、通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项目二、配置tomcat一、通过原型&#xff08;骨架&#xff09;创建MavenJavaWeb项…

【PTA】输出学生成绩

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 专栏&#xff1a;PTA习题及解析 介绍&#xff1a;记录了博主在pta学习练题 目录前言1.简介2.优点一、题目二、代码前言 1.简介 “PTA程序…

【面试题】面试官: Vue如何实现权限管理?

我正在参加「掘金启航计划」 一、权限管理 权限管理就是让不同的用户只能访问自己权限内的资源&#xff0c;有以下几种 路由权限&#xff0c;用户登录后只能看到自己权限内的导航菜单&#xff0c;且只能访问自己权限内的路由地址视图权限&#xff0c;用户只能看到自己权限内…

朗涛任命Juanita Zhang为中国大陆区总经理,Peggy Hon为中国香港区总经理

在迅速发展的消费环境中&#xff0c;带领才华横溢的多元创意团队&#xff0c;持续推动业务发展 &#xff08;中国上海&#xff0c;2022年9月27日&#xff09;近日&#xff0c;全球顶尖的品牌设计与咨询公司朗涛宣布重要人事任命&#xff0c;分别任命Juanita Zhang为中国大陆区总…

Eureka注册不上或注册后IP不对(多网卡的坑)

Eureka注册不上或注册后IP不对&#xff08;多网卡的坑&#xff09; 一、问题发现 ​ 使用SpringCloud一套的微服务项目在开发测试环境都再正常不过了&#xff0c;到生产部署的时候启动服务就死活无法启动&#xff0c;去看启动日志发现&#xff0c;在获取配置中心配置时连接不…

SpringBoot保姆级教程(二)SpringBoot入门

目录 一.通过官网搭建项目 二.通过IDEA脚手架搭建项目 三.SpringBoot项目结构 四.通过Maven搭建项目 五.编写Java代码 一.通过官网搭建项目 接下来我们搭建一个SpringBoot项目&#xff0c;并引入SpringMVC的功能&#xff0c; 首先我们可以通过官网搭建项目&#xff1a; 1 …

MYSQL介绍——数据库的增删改及常用函数

数据操作语言——INSERT语句 Insert 语句可以向数据库中插入数据&#xff0c;可以是一条数据&#xff0c;也可以是多条数据&#xff0c;它有以下语法形式&#xff1a; 下面给出一个插入语法的示例&#xff1a; INSERT INTO t_dept(deptno,dname,loc) VALUES(50,司法部,济南)…

(附源码)springboot篮球场地预约系统 毕业设计 345655

蓝球场地预约系统的设计与实现 摘 要 传统的场地预约需要客户亲自到场地所在位置或指定地点进行&#xff0c;由于预约记录多是认为完成&#xff0c;易于出现错误和漏洞&#xff0c;管理效率低&#xff0c;特别是场地繁杂时&#xff0c;传统的预约方式已经完全不能满足要求。 远…

一文读懂 Handler 消息处理机制(源码实战)

Android 异步消息处理机制解析 Android 中的异步消息处理主要由四个部分组成&#xff0c;Message、Handler、MessageQueue、Looper 但是当我们提到 Android 异步处理机制的时候&#xff0c;我们首先会想到 Handler&#xff0c;而大多数Android 初学者对于 Handler 的作用仅局…