RabbitMQ

RabbitMQ系列入门(一)概念

一、什么是MQ ?

1、MQ的概念

MQ 全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 下面用图来理解异步通信,并阐明与同步通信的区别。

同步通信:甲乙两人面对面交流,你一句我一句必须同步进行,两人除此之外不做任何事情

同步通信

异步通信:异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系,消息传给第三方后,两人可以做其他自己想做的事情,当需要获取对方说话的内容时,直接从消息队列里获取即可。

异步通信

2、理解消息队列

消息就是两台计算机间传送的数据单位;本质上就是一段数据,它能被一个或者多个应用程序所理解,是应用程序之间传递的信息载体。消息可以非常简单,例如只包含文本字符串;也可以更复杂地嵌入对象。

队列是数据结构中概念。在队列中,数据先进先出,后进后出,犹如排队做核酸。

消息队列 MQ是把消息和队列结合起来,称之为消息队列(Message Queue)。把要传输的数据(消息)与队列进行绑定,用队列先进先出机制来实现消息传递。消息队列由 生产者消费者两部分构成;生产者主要负责产生消息并把消息放入队列中,再由消费者去处理。消费者可以到指定队列中获取消息,或者订阅相应的队列,最后由MQ服务端进行消息推送。

**什么是订阅?**订阅就是为消费者服务的,消费者提前订阅,当消息队列中有消息产出时,自动去获取消息进行消费。生活中有很多这种例子,比如购买腾讯、优酷等视频会员时就会有订阅模式,当你的会员到期时,会自动帮你完成续费。

二、MQ的优势和劣势

1、优势和作用

应用解耦例如在我们非常熟悉电商系统平台中,用户下订单需要调用订单系统,订单系统需要调用库存系统、支付系统、物流系统等进行数据交互来完成整个下单业务,这种把整个业务都耦合在一起。很容易出现我们经常遇见的问题:

①、当中间某个环节库存系统或支付系统出现异常或故障,会造成整个订单系统崩溃无法完成订单业务;

②、当我们需求开发时,可能会新增一个其他系统的业务与当前的订单系统关联并进行数据交互,此时就必须修改订单系统的代码。如果系统壮大,业务越来越多,越来越复杂时,随之带来的维护成本也会成指数增加。

支付系统异常业务不可达

由此我们不难看出 **系统耦合性越高,容错性和可维护性就会越低。**如果在系统中引入MQ,即订单系统将消息先发送到MQ中,MQ再将数据消息转发到其他系统,问题就可以得到解决,MQ天生就是来干这个事的。那么当我们加入MQ以后整个系统会发生什么变化?

①、由于订单系统只发消息给MQ,不直接对接其他系统,如果其他任何一个系统出现异常或故障时,不影响整个订单业务的执行。当异常或故障解决以后,程序自动从MQ获取数据信息完成后续相关业务逻辑即可。

②、如果需求修改,新增了一个业务系统,此时无需修改其他系统的代码,只需修改MQ将消息发送给新增的系统即可,实现数据信息的可靠有效传递。使用MQ让系统应用间进行解耦,提升整个系统的容错性和可维护性

使用MQ,其他业务异常/故障,不影响业务的执行

异步提速开发一款App系统,其登录注册是最为常见的需求,例如注册的业务有手机注册入库、绑定邮箱验证、手机短信验证。

没有使用MQ前

用户的注册操作需要等待350ms才能得到响应,如果邮件验证系统/手机短信通知系统耗时比较长,那么用户的响应随之就会变长,非常影响客户的体验度,而当使用了MQ后,客户的体验度飙升。

使用MQ后

削峰填谷 假设系统承载的QPS是1000,如果流量顶峰时达到50000,则会造成系统压垮崩溃。使用了MQ之后,限制消费消息的速度为1000,把数据产生的压力放在MQ中,系统的高峰就会被削掉,这个过程叫 削峰 ,因为消息积压的数据比较多,在高峰期过后的一段时间内,消费消息的速度还会继续维持在这个速度,直到把积压的消息消费完,这个过程叫 填谷。这样可以大大提高系统的稳定性和用户体验。

2、劣势

  • 系统可用性降低: 系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
  • 系统复杂度提高: MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
  • 一致性问题 : A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败,则会造成数据处理的不一致。

三、MQ的应用场景

1、高峰流量:抢红包、秒杀活动、抢火车票等这些业务场景都是短时间内需要处理大量请求,如果直接连接系统处理业务,会耗费大量资源,有可能造成系统瘫痪。 而使用MQ后,可以先让用户将请求发送到MQ中,MQ会先保存请求消息,不会占用系统资源,且MQ会进行消息排序,先请求的秒杀成功,后请求的秒杀失败。

抢红包

2、消息分发:如电商网站要推送促销信息,该业务耗费时间较多,但对时效性要求不高,可以使用MQ做消息分发。

促销

3、数据同步:假如我们需要将数据保存到数据库之外,还需要一段时间将数据同步到缓存(如Redis)、搜索引擎(如Elasticsearch)中。此时可以将数据库的数据作为消息发送到MQ中,并同步到缓存、 搜索引擎中。

同步

4、异步处理:在电商系统中,订单完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作。为了保证订单系统的高性能,应该直接返回订单结果,之后让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时

消息通知

5、离线处理:在银行系统中,如果要查询近十年的历史账单,这是非常耗时的操作。如果发送同步请求,则会花费大量时间等待响应。此时使用MQ发送异步请求,等到查询出结果后获取结果即可。

离线同步数据

四、AMQP

1、什么是 AMQP : 即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,专门为消息中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受不同中间件产品,不同开发语言等条件的限制。2006年AMQP规范发布,类比HTTP。

2、AMQP工作过程: 生产者(Publisher)将消息发布到交换机(Exchange),交换机根据规则将消息分发给交换机绑定的队列(Queue),队列再将消息投递给订阅了此队列的消费者

AMQP

五、工作原理

工作原理

  • Producer【消息的生产者】 一个向交换机发布消息的客户端应用程序。
  • Connection**【连接】** 生产者/消费者和RabbitMQ服务器之间建立的TCP连接。
  • Channel【信道】 是TCP里面的虚拟连接。例如:Connection相当于电缆,Channel相当于独立光纤束,一条TCP连接中可以创建多条信道,增加连接效率。无论是发布消息、接收消息、订阅队列都是通过信道完成的。
  • Broker 消息队列服务器实体。即RabbitMQ服务器
  • Virtual Host【虚拟主机】 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换机、绑定和权限机制。当多个不同的用户使用同一个RabbitMQ服务器时,可以划分出多个虚拟主机。RabbitMQ默认的虚拟主机路径是 /
  • Exchange**【交换机】** 用来接收生产者发送的消息,并根据分发规则,将这些消息分发给服务器中的队列中。不同的交换机有不同的分发规则。
  • Queue【消息队列】 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。消息一直在队列里面,等待消费者链接到这个 队列将其取走。
  • Binding**【绑定】** 消息队列和交换机之间的虚拟连接,绑定中包含路由规则,绑定信息保存到交换机的路由表中,作为消息的分发依据。
  • Consumer【消息的消费者】 表示一个从消息队列中取得消息的客户端应用程序。

如何创建队列

http://wed.xjx100.cn/news/72539.html?action=onClick

来源: 绝对详细的 RabbitMQ入门,看完本系列就够了 - 知乎

相关推荐
用户8307196840821 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者2 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧5 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖6 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农6 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者6 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀6 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3056 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05096 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式