目录
RabbitMQ 简介
RabbitMQ 是一个高可靠的消息队列系统(Message Broker),在不同的服务之间异步传输消息,实现系统与系统之间的解耦,在不稳定的流量面前,可以实现稳定的削峰填谷,为系统的可扩展性提供了基础设施。
官网的介绍是:
RabbitMQ is a message broker: it accepts and forwards messages. You can think about it as a post office: when you put the mail that you want posting in a post box, you can be sure that the letter carrier will eventually deliver the mail to your recipient. In this analogy, RabbitMQ is a post box, a post office, and a letter carrier.
可以把它想象成一个邮局系统,写信的人不需要自己把信件送到收信人手上,只需要投递到邮局,RabbitMQ 就扮演了这个邮局的角色。
RabbitMQ 也被称为消息中间件(Message Middleware),因为它的定位是处于各个服务之间,充当消息中枢,并不负责处理业务逻辑,只负责可靠地接收、存储并转发消息,是典型的基础设施组件。
基本概念
RabbitMQ 有以下一些概念:
Producer
生产者,消息的产生来源,业务系统一般担任此角色,负责把消息投递给消息中间件。
Consumer
消费者,消息的处理方,业务系统一般担任此角色,负责从消息中间件中获取消息并进行业务处理。
Queue
队列,就是消息存放的地方,生产者往队列投递信息,消费者从队列取出信息。
Binding
Exchange
特点
优势1:异步
第一个优势是,解耦系统架构,把同步模式改成了异步模式,如果没有消息中间件的情况下,A 需要调用 B 的服务,A 得先知道 B 的地址或者名称(比如服务器地址和接口),通过 HTTP 发起调用,在这一步会阻塞,直到 B 处理完成后,A 才能继续下一步。
引入了消息中间件,A 不需要直接请求 B,A 甚至不需要知道 B 的存在,因为 A 只需要往队列里递交任务就行了,至于消费者 B 可以有一个也可以有多个,A 和 B 可以是完全独立的,用不同语言编写的服务。
优势2:抗并发
传统模式下,并发量一旦升高,响应速度就会变慢,业务逻辑的处理就会成为系统瓶颈,尤其在很多流量分配不均的场景中,会在某些时刻产生很大的瞬时流量。
消息中间件可以充当缓冲层,大量的瞬时任务可以积压在队列中(能堆积多少,取决于队列所处服务器的内存或磁盘空间),这样消费者不会被瞬间的大流量冲垮,可以按照固定的速率均匀的消费信息和执行任务。
优势3:扩容和稳定性
传统模式下,如果消费者服务 B 挂了,那么 A 也会跟着报错(无法调用成功),消息队列可以在消费者宕机的情况下,缓存任务,等到消费者服务重新上线后,继续执行宕机期间未完成的任务。
由于使用了异步的模式,当瓶颈出在消费者时,可以迅速拉起多个消费者共同消费一个队列中的任务。
使用场景
无论是异步还是抗住高并发,主要集中在流程耗时这个场景,意味着大部分瓶颈都是在任务消费者服务中,以下单为例,用户下单后,系统需要执行:
- 扣减库存
- 持久化订单信息
- 计算计分
- 发送短信或者邮件
- 根据下单元数据,调用推荐算法
如果所有业务按照顺序执行的话,用户就会在调用下单接口后,进入漫长的等待。
但实际上,只需要把下单信息持久化到数据库,然后往队列里发送下单信息,下游的消费者再按照自己的速率去完成计算和发送通知等耗时的服务。
IO 密集型(爬虫或者电商下单),CPU 密集型(图片压缩或者视频处理),瓶颈都是消费者,生产者如果没有消息队列,那么用户体验或者系统吞吐量会很糟糕。