MQ(消息队列)
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
介绍:消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下,生活中买东西,需要排队,先排的人先买消费,就是典型的“先进先出”。
消息传递:指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
排队:指的是应用程序通过队列来通信。
为什么会产生消息MQ
随着微服务架构的流行,MQ成了解决微服务之间问题的常用工具。
以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。
当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障。提升系统的可用性。
不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;在项目中,可将一些无需即时返回且耗时的操作提取出来,进行**异步处理**,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而**提高**了**系统**的**吞吐量**。
消息队列应用场景
应用解耦
以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。
当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障。提升系统的可用性。
传统模式:
传统模式的缺点:
系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
中间件模式:
中间件模式的优点:
将消息写入消息列表,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
异步处理
场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种
1.串行的方式;
2.并行的方式
(1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.
(2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。
(3)消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理
传统模式的缺点:
一些非必要的业务逻辑以同步的方式运行,太耗费时间。
中间件模式的的优点:
将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
流量削峰
流量削峰一般在秒杀活动中应用广泛
场景: 秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用:
1、可以控制活动人数,超过此一定阈值的订单直接丢弃。
2、可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
QPS
QPS:QPS即每秒查询率,是对一个特定的查询服务器在规定时间内处理流量多少的衡量标准。因特网上,经常用每秒查询率来衡量域名系统服务器的机器的性能,即为QPS。
或者理解:每秒的响应请求数,也即是最大吞吐能力。
PV , UV , PR
PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。
对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面。这里需要强调:同一个人浏览你网站同一个页面,不重复计算pv量,点100次也算1次。说白了,pv就是一个访问者打开了你的几个页面。
PV之于网站,就像收视率之于电视,从某种程度上已成为投资者衡量商业网站表现的最重要尺度。
pv的计算:当一个访问着访问的时候,记录他所访问的页面和对应的IP,然后确定这个IP今天访问了这个页面没有。如果你的网站到了23点,单纯IP有60万条的话,每个访问者平均访问了3个页面,那么pv表的记录就要有180万条。
uv(unique visitor),指访问某个站点或点击某条新闻的不同IP地址的人数。
PR值,即PageRank,网页的级别技术,用来标识网页的等级/重要性。级别从1到10级,10级为满分。PR值越高说明该网页越受欢迎(越重要)。
MQ有哪些缺点
1. 系统复杂性增加。毕竟是增加了一个中间件MQ,那么系统变得更复杂,就是不可避免的。但是,与其说是系统复杂性增加,不如说是给相关开发人员带来的新的学习成本。但是,一项技术本身就是这样,学时很痛苦,学会了,它就会变成一把利剑,帮助您开疆辟土。
2. 系统可用性降低。假设一个系统由若干个节点链式组成,每个节点出问题的概率是相同的,那么,20个节点的系统出问题的概率显然要高于10个节点的系统。所以,从这个角度来看,毕竟是增加了一个MQ中间件,出问题的概率显然会增大,系统可用性就会降低。
RabbitMQ
RabbitMQ提供了5种模式:
简单模式:一个生产者发送消息到队列中由一个消费者接收。
work模式:一个生产者、多个消费者,多个消费者,共同监听一个队列,一个消息,只能被一个消费者获取
Publish/Subscribe发布与订阅模式:一个生产者并不会直接往一个队列中发送消息。
Routing路由模式:会根据发送的key键发送给对应队列。
Topics主题模式:发送的消息以及与交换机与队列绑定的关系都需设置自属的路由键,并且绑定(Binding)的路由键支持通配符,生产者向交换机发送消息之后,交换机会在与之绑定的队列中寻找路由键与消息的路由键能匹配上的队列推送该消息。若没有相匹配的,则该消息丢失。
代码。。。不知道怎么放才好,第一次写文章,希望多理解。