前言
RabbitMQ 是一个实现了 AMQP(高级消息队列协议)的消息队列服务,是当前主流的消息中间件之一。在互联网架构中,经常使用 MQ 作为消息通信服务。
AMQP(Advanced Message Queuing Protocol),即高级消息队列协议,是一个通用的应用层协议,提供统一消息服务的协议,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端或中间件、开发语言等条件的限制。
一、什么是 MQ(消息队列)
MQ(Message Queue),从字面意思上看,本质是个队列,FIFO(先进先出),只不过队列中存放的内容是消息(message)而已。消息可以非常简单,比如只包含文本字符串、JSON 等,也可以很复杂,比如内嵌对象。
MQ 多用于分布式系统之间进行通信
系统之间的调用通常有两种方式:
- 同步通信:直接调用对方的服务,数据从一端发出后立即就可以达到另一端。
- 异步通信:数据从一端发出后,先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端。容器的一个具体实现就是 MQ(Message Queue)。
RabbitMQ 就是 MQ 的一种实现。
例如:打电话客服直接响应;客服记录下来,过一段时间(24 小时)内进行回复。
二、MQ 的作用
MQ 主要工作是接收并转发消息,在不同的应用场景下可以展现不同的作用。
可以把 MQ 想象成一个仓库。采购部门进货之后,把零件放进仓库里,生产部门从仓库中取出零件,并加工成产品。MQ 和仓库的区别是,仓库里放的是物品,MQ 里放的是消息。仓库负责存储物品,并转发物品,MQ 负责存储和转发消息。
1、异步解耦
在业务流程中,一些操作可能非常耗时,但并不需要即时返回结果。可以借助 MQ 把这些操作异步化,比如用户注册后发送注册短信或邮件通知,可以作为异步任务处理,而不必等待这些操作完成后才告知用户注册成功。
2、流量削峰
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费。使用 MQ 能够使关键组件支撑突发访问压力,不会因为突发流量而崩溃。比如秒杀或者促销活动,可以使用 MQ 来控制流量,将请求排队,然后系统根据自己的处理能力逐步处理这些请求。
例如:12306 节假日的时候进行买票(不可能在这个时候买入多台机器);商场人多的时候进行排队。
3、消息分发
当多个系统需要对同一数据做出响应时,可以使用 MQ 进行消息分发。比如支付成功后,支付系统可以向 MQ 发送消息通知订单系统发货。
4、延迟通知
利用 MQ 的延迟特性,可以实现定时任务或延迟通知功能,例如订单超时未支付自动取消。
三、为什么选择 RabbitMQ
常见的消息队列有 Kafka、RocketMQ 和 RabbitMQ。
- Kafka:高吞吐量,适合日志收集、大数据流处理,但在低延迟和高可靠性方面不如 RabbitMQ。
- RocketMQ:阿里开源,支持事务消息,适合金融级场景,生态丰富。
- RabbitMQ:基于 Erlang 开发,社区活跃,管理界面友好,支持多种协议,适合中小规模及企业级应用,学习曲线相对平缓。
四、RabbitMQ 快速上手
1、Ubuntu 环境安装
确保 Ubuntu 系统已更新,并安装必要的依赖工具。
sudo apt-get update
sudo apt-get install curl gnupg software-properties-common
2、安装 Erlang
RabbitMQ 运行依赖于 Erlang 虚拟机(BEAM)。需要先安装 Erlang。
# 添加 Erlang 解决方案仓库
add-apt-repository ppa:erlang-solutions/erlang-solutions
sudo apt-get update
apt-get install erlang-nox


