RabbitMQ 简介

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

解耦

当发送短信执行成功后页面才执行倒计时60秒,假如在发送短信时网速原因,导致短信一直被阻塞,那么倒计时也会被一直延迟,这样及其影响用户体验感。

这时候就可以使用RabbitMQ了,将发送短信和倒计时解耦,基于消息的模型,关心的是“通知”,而非“处理”。

像下订单、邮件通知、缓存刷新等操作都可以使用消息队列进行优化。

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_rabbitmq

异步提升效率

场景说明:用户需发送短信验证码时,点击发送短信,第三方平台发送短信至用户手机成功,执行倒计时60秒。传统的做法有两种 1.串行的方式;2.并行方式:

(1) 串行方式:将用户点击发送短信,第三方平台发送短信至用户手机成功,执行倒计时60秒。以上三个任务全部完成后,返回给客户端(响应150ms)。

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_后端_02

(2) 并行方式:在用户点击发送短信成功后,第三方平台发送短信的同时,执行倒计时60秒。与串行的差别是,并行的方式可以提高处理的时间(响应100ms)。

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_消息队列_03

(3) 引入消息队列,将不是必须的业务逻辑,异步处理(55ms)。改造后的架构如下:

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_rabbitMQ如何添加一条消息队列_04

流量削峰

流量削锋(流量错峰)也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至5000条,但是系统最大的处理能力只能每秒处理2000个请求(因为MySQL每秒只能处理2000个请求,MySQL的缺点:在海量数据处理与热数据时,效率会显著变慢),于是系统崩溃,服务器宕机。

引入RabbitMQ:系统A从RabbitMQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。RabbitMQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在RabbitMQ中。这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入RabbitMQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在RabbitMQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_消息队列_05

RabbitMQ的基本架构

rabbitMQ如何添加一条消息队列 rabbitmq怎么发消息_rabbitmq_06

1、简单队列模式

不用显示声明交换机,只需声明一个队列

生产者指定队列名发送消息给MQ,然后会有一个默认的交换机将消息转发给这个队列。

消费者负责监听这个队列,一有消息就会得到通知做出响应。

2、工作队列模式(Work queues)

和简单队列模式基本一样,不过有一点不同,该模式有多个消费者在监听队列。

RabbitMQ会以轮询的方式将消息发给多个消费者确保一条消息只会被一个消费者消费

3、发布订阅模式(Publish/subscribe)

和上面2种模式默认提供交换机不同的是,该模式需要显示声明交换机,

然后可以创建多个队列和这个交换机进行绑定。

生产者发消息给mq时需要指定交换机,然后交换机将消息转发给与自己绑定的所有队列

消费者监听指定的队列获得消息。每个队列可以有多个消费者监听,同样也是以轮询的机制发给消费者。

4、Routing 模式

和发布订阅模式不同的是,队列绑定交换机时需要指定一个routingkey

那么生产者发送消息时不仅需要指定交换机还需要指定routingkey

这样的话交换机就会把消息转发给跟自己绑定并且routingkey相匹配的队列

5、Topic模式

和Routing模式唯一的不同就是可以设置带有通配符进行模糊匹配的routingkey

6、heard模式

和Routing模式的不同就是取消了routing 使用键值对的方式作为routing

RabbitMQ学习教程

动力节点的RabbitMQ课程将详细讲解RabbitMQ的环境搭建、消息的发送与接收、消息确认、与SpringBoot集成等,让大家快速掌握RabbitMQ技术,以适应项目开发的需要。

  • RabbitMQ实战入门教程

https://www.bilibili.com/video/BV1Ap4y1D7tU

  • RabbitMQ教程配套资料下载

http://www.bjpowernode.com/?csdn

课程目录

•001.RabbitMQ: 什么是消息队列

•002.RabbitMQ: 为什么使用消息队列

•003.RabbitMQ: RabbitMQ的特点

•004.RabbitMQ: 安装RabbitMQ

•005.RabbitMQ: 启动和关闭服务

•006.RabbitMQ: 插件添加

•007.RabbitMQ: 用户管理

•008.RabbitMQ: 权限分配

•009.RabbitMQ: vhost

•010.RabbitMQ: AMQP协议机制

•011.RabbitMQ: 消息路由交换机类型

•012.RabbitMQ: Direct类型交换机

•013.RabbitMQ: Fanout类型交换机

•014.RabbitMQ: Topic类型交换机

•015.RabbitMQ: 消息发送

•016.RabbitMQ: 消息发送测试

•017.RabbitMQ: 消息接收

•018.RabbitMQ: 消息接收测试

•019.RabbitMQ: 交换机-direct-消息接收

•020.RabbitMQ: 交换机-direct-消息发送

•021.RabbitMQ: 交换机-fanout-消息接收

•022.RabbitMQ: 交换机-fanout-消息发送

•023.RabbitMQ: 交换机-topic-消息接收和发送

•024.RabbitMQ: 交换机-fanout和topic使用场景对比

•025.RabbitMQ: 事务性消息发送

•026.RabbitMQ: 事务性消息接收

•027.RabbitMQ: 发送者确认模式-普通确认

•028.RabbitMQ: 发送者确认模式-批量确认

•029.RabbitMQ: 发送者确认模式-异步确认

•030.RabbitMQ: 消费者确认模式-手动确认消息

•031.RabbitMQ: 消费者确认模式-事务对接收的影响以及防重复处理

•032.RabbitMQ: SpringBoot集成RabbitMQ-direct发送消息

•033.RabbitMQ: SpringBoot集成RabbitMQ-direct接收消息

•034.RabbitMQ: SpringBoot集成RabbitMQ-异步监听接收消息

•035.RabbitMQ: SpringBoot集成RabbitMQ-fanout接收消息

•036.RabbitMQ: SpringBoot集成RabbitMQ-fanout发送消息

•037.RabbitMQ: SpringBoot集成RabbitMQ-topic发送和接收消息

•038.RabbitMQ: 集群-集群模式介绍

•039.RabbitMQ: 集群-环境搭建

•040.RabbitMQ: 集群-配置集群

•041.RabbitMQ: 集群-SpringBoot链接集群

•042.RabbitMQ: 集群-镜像集群配置