文章目录
- ActiveMQ消息队列的核心概念
- 1.什么是MQ消息队列
- 2.为什么要使用MQ消息队列
- 3.MQ消息队列的应用场景
- 3.1.异步处理
- 3.2.应用解耦
- 3.3.流量削锋
- 4.常见的MQ消息队列产品对比
ActiveMQ消息队列的核心概念
1.什么是MQ消息队列
Message Queue消息队列简称MQ,消息队列从字面的含义来看就是消息的发生和接收保持排队顺序。
消息队列可以简单的理解为把要传输的数据放在队列中一一发送。
**消息:**要传输的数据。
**队列:**先进先出的数据结构。
在消息队列中,数据放到消息队列叫做生产者,从消息队列中获取数据叫做消费者。
消息队列是一种异步的服务通信方式,是分布式系统中重要的组件,主要解决的问题包含:应用解耦、异步消息、流量削锋等问题,实现高可用、高性能、可伸缩和最终一致性的架构。
异步通信与同步通信的区别:
一个生活中的例子,当采用异步通信时,要找一个人,可以从知道这个人信息的另外一个人处拿到消息,迅速找到对应的人员。当采用同步通信时,要找到一个人,会从遇到的任何一个人开始询问,最后找到对应的人,效率低。
异步通信是面向字符的通信,同步通信时面向比特的通信。
使用较多的MQ消息队列产品有RocketMQ、RabbitMQ、Kafka、ActiveMQ等等。
2.为什么要使用MQ消息队列
举例生活中的一个例子来解释引入MQ前后的对比:
引入MQ之前:
我们日常生活中需要经常性的购物结账,当我们选好商品要结账时,发现收银员只有一个,但是顾客此时很多,一个顾客结账都需要5分钟左右,每个顾客都需要排队等候,浪费的时间很长,并且收银员的压力也会非常大,没有任何休息的时间,一直在处理交易。
引入MQ之后:
当引入了MQ消息队列后,收银员还是只有一个,但是此时多了一个自助收银机(MQ消息队列),顾客这个时候就可以在自助收音机这里排队付款,收银员的压力就大大降低了,收银员只在顾客付完款之后查看钱款是否正确即可,顾客就是生产者,收银员就是消费者,自助机的效率比收银员人工的高很多,再大大提高效率的同时也减去了收银员的压力。
例子中的顾客就好比是用户/服务的请求,自助机就是MQ消息队列,收银员就是应用程序。
程序没有接入MQ之前,服务之间需要频繁调用,影响服务端整体性能,接入MQ消息队列后,通过生产和消费机制,可以增大程序的并发量,提高系统的性能。
3.MQ消息队列的应用场景
MQ消息队列的应用场景分为异步处理、应用解耦、流量削锋等等。
3.1.异步处理
异步处理分为三种模式:串行方式、并行方式、异步处理。
以一个场景说明异步处理三种模式的不同之处,场景:用户注册需要执行三个业务逻辑,分布写入用户表、发送邮件以及注册短信的通知。
串行方式:
如下图所示,用户的提交了注册信息后,首先需要在数据库中写入注册信息,然后发送一个邮件通知用户,最后再发送一个短信通知,三个流程完成后,注册才算完成,这三个流程是串行的,也就是说当一个流量结束后,另一个流程才会开始,每一个流程的耗时为50毫秒,用户完成一个注册流程总共需要150毫秒。
串行方式指的就是按照先后顺序,一个一个的执行。
并行方式:
如下图所示,当架构调整为并行方式时,用户提交注册信息到数据库后,可以同时发生邮件通知和短信通知。
邮件和短信为并行方式,会同时处理当前流程,并行的方式可以大大提高处理的时间,此时用户完成注册仅需100毫秒。
异步处理:
引入消息中间件之后才可以使用异步处理的方式。
如下图所示,当架构调整为异步处理时,用户提交注册信息到数据库的同时,也会将发送邮件和短信的请求写入到消息队列中,再通过异步的方式从消息队列中读取消息,进行发送邮件和短信的通知流程。
程序接入MQ消息队列后,用户将注册信息写入到数据库的时间也就是整个注册完成的时间,顶多增加一个写入消息队列的时间,写入消息队列是非常块的,接入消息队列后,程序的响应速度可以得到大幅度提升。
3.2.应用解耦
以一个场景说明程序接入MQ后应用解耦的场景,场景说明:用户下单后,订单系统调用库存系统完成库存的缩减。
在传统情况下,服务之间是直接调用的,如下图所示用户下单完成后,订单系统会去调用库存系统,完成商品的购买。
服务之间相互调用时没有问题的,但是存在一个弊端,如果库存系统宕机无法访问,那么订单系统下单后无法再库存中缩减,就会导致下单失败,订单系统和库存系统存在耦合性。
面对以上问题,如何解决应用系统之间的解耦呢,就可以引入MQ消息队列了。
如下图所示,当程序接入了MQ消息队列,用户在订单系统完成了下单,此时会将订单信息写入到消息队列,然后返回用户下单完成,然后由库存系统从消息队列中采用pull/push的方式,订阅消息队列中下单的消息,然后完成库存的缩减。
即使当库存系统故障了,用户下单完成后只要将消息能够写入消息队列,就可以保证用户下单的状态是完成的,消息队列中的数据可以持久化,当库存系统修复后可以直接从消息队列中进行订阅,完成整个流程操作,从而实现了应用的解耦。
3.3.流量削锋
流量削锋也是一种典型的应用场景,一般应用于高并发时刻,例如秒杀活动,高并发时一般会因为流量过大,导致应用的状态异常,从而影响线上用户的使用,通过MQ消息队列就可以解决此问题。
通过MQ消息队列可以控制请求的流量、缓解短时间内高并发压垮应用系统。
如下图所示,用户的请求首先被写入到消息队列中,由应用系统通过策略读取消息队列中的数据,然后进行处理,用户的请求相当于生产者,程序相当于消费者。
4.常见的MQ消息队列产品对比
MQ产品 | 开发语言 | 单机吞吐量 | 时效性 | 可用性 | 功能特性 |
---|---|---|---|---|---|
ActiveMQ | JAVA | 万级 | 毫秒级 | 高(支持主从架构) | 产品成熟,文档多,各种协议支持下高 |
RabbitMQ | Erlang | 万级 | 微秒级 | 高(支持主从架构) | 基于Erlang开发,并发能力强,性能极高,延时很低,管理界面较丰富 |
RocketMQ | JAVA | 十万级 | 毫秒级 | 非常高(分布式架构) | MQ功能比较完备,扩展性强 |
Kafka | Scala | 十万级 | 毫秒级 | 非常高(分布式) | 大数据领域应用广泛 |