MQ的介绍与应用场景
1、什么是MQ
MQ(Message Quene) : 翻译为消息队列,就是指存储消息的一个容器。它是一个典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,可以轻松的实现系统间解耦。别名为:消息中间件,通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
下面是MQ最简单的模型,它包含了四个关键词:生产者、消费者、消息和队列。
- 生产者:就是用于生产消息的应用程序。
- 消息:就是要传输的数据,可以是最简单的文本字符串,也可以是自定义的复杂格式(只要能按预定格式解析出来即可)。
- 队列:大家应该再熟悉不过了,是一种先进先出数据结构。它是存放消息的容器,消息从队尾入队,从队头出队,入队即发消息的过程,出队即收消息的过程。
- 消费者:就是用于读取队列中消息的应用程序。
2、MQ的应用场景
使用消息中间件最主要的目的:
- [1] 应用解耦
- [2] 异步处理
- [3] 流量削峰
2.1 应用解耦
场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
传统模式的缺点:
- 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
- 由于订单系统调用了库存系统的接口,所以它们存在耦合
引入消息队列后的做法:
- 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
- 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
- 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
- 为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。
2.2 异步处理
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式
(1) 串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端
(2) 并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
(3) 引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:
2.3 流量削峰
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。
传统架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。
引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。
3、使用MQ的优缺点
消息队列的优点:
- 解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的。消息生产者和消费者都不知道对方的存在;
- 异步:主流程只需要完成业务的核心功能;对于业务非核心功能,将消息放入到消息队列之中进行异步处理,减少请求的等待,提高系统的总体性能;
- 削峰/限流:将所有请求都写到消息队列中,消费服务器按照自身能够处理的请求数从队列中拿到请求,防止请求并发过高将系统搞崩溃;
消息队列的缺点:
- 系统的可用性降低:系统引用的外部依赖越多,越容易挂掉,如果MQ 服务器挂掉,那么可能会导致整套系统崩溃。这时就要考虑如何保证消息队列的高可用了;
- 系统复杂度提高:加入消息队列之后,需要保证消息没有重复消费、如何处理消息丢失的情况、如何保证消息传递的有序性等问题;
- 数据一致性问题:A 系统处理完了直接返回成功了,使用者都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,就会导致数据不一致了;
4、不同MQ之间的区别
市场上常见的消息队列有如下:
- ActiveMQ:Apache出品,基于JMS,是最早使用的消息队列产品,时间比较长了,现在已经不再维护了。
- ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景。扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发大量的代码。
- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
- RocketMQ:基于JMS,阿里开源的消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
- Kafka:类似MQ的产品;分布式消息系统,高吞吐量
注:每种MQ没有绝对的好坏,主要依据使用场景,扬长避短,利用其优势,规避其劣势。
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
厂商 | Rabbit | Apache | Alibaba | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | AMQP,OpenWire,STOMP,XMPP,REST | 自定义 | 自定义(基于TCP),社区封装了Http协议支持 |
优点 | 基于erlang,并发能力强,性能极好,延迟极低,稳定性和安全性很高,对性能和吞吐量的要求在其次,管理界面美观,社区非常活跃。 | 遵循JMS规范,安装方便,业界成为老牌,丰富的API和参考文档 | 在阿里被广泛应用于交易、充值、流计算、消 息推送、日志流式处理、binglog分发等场景。 | 依赖zk,可动态扩展节点,提供超高的吞吐量、极高的可用性以及可靠性 |
缺点 | Erlang语言难较大,不支持动态扩展;吞吐量会低一些,Rabbitmq的集群动态扩展很麻烦 | 有可能会丢失消息,该MQ不再维护,重心在下一代产品apolle | 社区活跃一般,随时会被阿里抛弃 | 严格的顺序机制,不支持消息优先级,不支持标准的消息协议,不利于平台迁移 |
时效 | 微妙级 | 毫秒级 | 毫秒级 | 毫秒以内 |
可用性 | 高,基于主从架构实现高可用 | 高,基于主从架构实现高可用 | 非常高,分布式架构 | 非常高,分布式架构 |
可靠性 | 基本不丢数据 | 有较低的概率丢失数据 | 通过参数优化,可以做到0丢失 | 通过参数优化,可以做到0丢失 |
应用 | 适合对稳定性要求高的企业级应用 | 适合中小企业,不适合上千个队列的应用 | 适合大型企业和大规模分布式系统应用 | 应用在大数据日志处理或对实时性、可靠性要求较低的应用场景(少量数据丢失) |
5、补充:QPS,TPS,PPV,UV,PR
[1]、QPS(Queries Per Second):即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。每秒查询率:在因特网上,经常用每秒查询率来衡量域名系统服务器的机器的性能,即为QPS。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
[2]、TPS(Transactions Per Second):每秒事务数,每秒系统能够处理的事务次数。
[3]、PV(page view):即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。对PV的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面。这里需要强调:同一个人浏览你网站同一个页面,不重复计算PV量,点100次也算1次。说白了,PV就是一个访问者打开了你的几个页面。PV之于网站,就像收视率之于电视,从某种程度上已成为投资者衡量商业网站表现的最重要尺度。
PV的计算:当一个访问着访问的时候,记录他所访问的页面和对应的IP,然后确定这个IP今天访问了这个页面没有。如果你的网站到了23点,单纯IP有60万条的话,每个访问者平均访问了3个页面,那么pv表的记录就要有180万条。
[4]、UV(Unique Visitor):指访问某个站点或点击某条新闻的不同IP地址的人数。在同一天内,uv只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。独立IP访问者提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。
[5]、PR值:即PageRank,网页的级别技术,用来标识网页的等级/重要性。级别从1到10级,10级为满分。PR值越高说明该网页越受欢迎(越重要)。例如:一个PR值为1的网站表明这个网站不太具有流行度,而PR值为7到10则表明这个网站非常受欢迎(或者说极其重要)。
[6]、计算关系:
- QPS = 并发量 / 平均响应时间
- 并发量 = QPS * 平均响应时间
- 原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。
- 公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。
- 机器数量:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 。
参考资料: