一、消息队列的三大功能
1.流量削峰
典型的就是电商场景中的订单超量。比如订单系统只能承受1万/秒的并发量,在搞活动时进来了2万/秒的单量,那么订单系统就宕机了。
没有MQ时可以采取限制下单,订单量达到一万后限制用户下单,很明显这样体验极差。
若使用MQ作为缓冲则可以取消这个限制,它将一秒内处理不完的订单分散到更长的一段时间去处理,这样虽然用户可能得等一段时间才能获得下单成功的反馈,但比完全下不了单体验好。
2.应用解耦
仍以电商场景中的用户下单为例,一个完整的下单流程涉及订单系统、支付系统、库存系统、物流系统等。
假如这几个子模块是相互紧密耦合的,那么任意一个模块出现bug将会牵一发而动全身,下单操作就无法完成。
加入MQ后就不会有这种情况,假如物流系统发生故障,可以做一个现场保护,将待处理的缓存在MQ中,等物流系统修复后再继续处理缓存的内容。在用户感知层面,他的下单操作已经正常完成。当物流系统恢复后再继续处理订单即可,下单用户无法感知到物流系统的故障,提升了用户体验。
3.优雅的异步处理
这里需要再明确一下异步的概念,通俗地讲,就是发送一个请求,不等待返回值,随时可以再发送下一个请求。
假如A请求B,B需要很长时间处理,但A需要知道B什么时候处理好。不采用MQ时有两种不优雅的处理方式,一种是A隔一段时间去查询一下B是否处理好;另一种是A提供一个callback接口,B处理完后调用A的这个接口通知A(这样就使A与B间的耦合性提高了)。
若加入MQ,那么A只需监听MQ里是否有B处理完成的消息,B只需处理完成后给MQ发一条已完成的消息。这样减少了API的开发,降低了耦合性。
二、AMQP详解
我们为什么要讲AMQP,因为RabbitMQ就是基于AMQP实现的。
初识AMQP
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是一个进程间传递异步消息的网络协议。
这里的进程间主要是指符合要求的客户端和消息中间件代理之间,它天然具有跨平台、跨语言的特性。(JMS仅支持Java)
这个协议中最重要的三个角色就是发布者、消费者和消息代理,消息代理接收发布者生产的消息,根据一定的路由规则将消息转发给处理消息的消费者。因为AMQP是一个网络协议,所以这三个角色可以在不同的服务器上。