一、RabbitMQ简介MQ的全称是MessageQueue,MessageQueue(MQ)是一种应用程序到应用程序的通信方式。应用程序通过在队列中读取和写入消息(特定于应用程序的数据)进行通信,而无需专用连接来链接它们。消息传递是指程序通过在消息中发送数据来相互通信,而不是通过直接调用来相互通信,这通常用于远程过程调用等技术。队列是指应用程序通过队列进行通信。队列的使用消除了接收和发送应用程序同时执行的要求。RabbitMQ是一个使用Erlang语言开发,基于AMQP协议实现的开源消息队列系统。AMQP的主要特点是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性和安全性。AMQP协议多用于企业系统,对数据的一致性、稳定性、可靠性要求较高,对性能和吞吐量的要求次之。二、RabbitMQ使用场景1、解耦(为面向服务架构(SOA)提供基本的最终一致性实现)场景描述:用户下单后,订单系统需要通知库存系统。传统上,订单系统调用库存系统的接口。传统模式的缺点:如果无法访问库存系统,订单将无法减少库存,导致订单失败。订单系统与库存系统相结合。消息队列订单系统介绍:用户下单后,订单系统完成持久化过程,将消息写入消息队列,成功返回用户订单库存系统:订阅订单消息,使用pull/push方式获取订单信息,库存系统会根据订单信息进行库存操作如果:下单时库存系统无法正常使用。不影响正常下单,因为下单后,订单系统写入消息队列,不再关心后续其他操作。实现订单系统和库存系统的应用解耦为了保证库存一定有货,队列大小可以设置为库存数量,也可以采用其他方式解决。基于消息的模型关注的是“通知”而不是“处理”。短信、邮件通知、缓存刷新等操作使用消息队列进行通知。消息队列与RPC的区别与比较:RPC:异步调用,及时获取调用结果,强一致性结果,关注业务调用处理结果。消息队列:两次异步RPC调用,将调用内容转储到队列中,选择合适的时间投递(交错流控)2.异步效率提升场景描述:用户注册后,需要发送注册邮件并注册短消息。传统的做法有两种:1.串行方式;2、并行模式扩展:异步并发利器:在实际项目中使用CompletionService提升系统性能的一种实践(1)串行模式:注册信息成功写入数据库后,发送注册邮件,然后发送注册短信。以上三个任务全部完成后,返回给客户端(2)并行模式:将注册信息成功写入数据库后,发送注册邮件,同时发送注册短信。以上三项工作完成后,返回给客户端。与串行不同的是,并行方式可以提高处理时间,引入消息队列,不需要业务逻辑和异步处理。修改后的架构如下:3.流量调峰流量调峰也是消息队列中常见的场景。一般用于秒杀或群抢活动。运行稳定。系统每晚8点有秒杀活动,每秒并发请求增加到10000,但是系统最大处理能力每秒只能处理1000个请求,所以系统崩溃,服务器走向下。前期架构:晚上8点高峰时段,大量用户(100万用户)通过浏览器同时参与秒杀活动。大量请求涌入我们的系统,高峰期达到每秒5000个请求,大量请求打到MySQL,估计每秒执行3000条SQL。不过一般MySQL每秒处理2000个请求已经不错了。如果达到3000个请求,MySQL可能会直接瘫痪,以至于系统无法使用。但是高峰期过后,就变成了低峰期。可能只有10000个用户访问系统,每秒的请求数只有50左右,整个系统几乎没有压力。引入MQ:100万用户在高峰期每秒请求5000次左右。如果这5000个请求写入MQ,系统A每秒最多只能处理2000个请求,因为MySQL每秒只能处理2000个请求。问。系统A从MQ中慢慢拉取请求,每秒拉取2000个请求,应该不会超过每秒可以处理的请求数。MQ,每秒有5000个请求进来,只有2000个请求出去,所以在秒杀期间(将近一个小时)MQ里面可能积压了几十万,上百万的请求。关于流量调峰:秒杀系统流量调峰怎么办?这个短暂的高峰期积压是没有问题的,因为高峰期过后,每秒只有50个请求进入MQ,但是系统仍然以每秒2000个请求的速度处理,所以只要高峰期一过,系统会快速消耗积压的消息。我们这里算一下,MQ每秒3000条消息的积压,一分钟积压18万条,1小时积压1000万条消息。过了高峰期,1个多小时就可以消费完积压的1000万条消息。3、引入消息队列的优缺点优缺点是以上场景的应用,即在特殊场景下有相应的好处,比如解耦、异步、调峰等。缺点系统的可用性降低。系统引入的外部依赖越多,系统就越容易挂掉。本来只有A系统调用BCD三个系统接口,ABCD四个系统不报错。整个系统将正常运行。引入MQ后,虽然ABCD系统没有报错,但是MQ挂掉后整个系统就会崩溃。系统复杂度增加,引入MQ后,需要考虑的问题更多。如何保证消息不被重复消费?如何保证消息不丢失?如何保证消息传递的顺序?一致性问题系统A发送消息后直接返回成功,但是如果BCD系统中有任何一个系统写入数据库失败,就会出现数据不一致。总结所以综上所述,消息队列是一个非常复杂的架构。引入它有很多优点,但是必须做出各种额外的技术方案和架构来避免它带来的缺点。引入MQ系统的复杂度增加了一个数量级,但在某些场景下,即使复杂十倍、一百倍,MQ还是要用的。
