RabbitMQ是一款基于Erlang语言开发,开源的分布式消息中间件,支持AMQP(Advanced Message Queued Protocol)协议,支持Java、Golang、php、python等多种开发语言客户端。
特性
- 可靠性:通过支持消息持久化,支持事务,支持消费和传输的 ack 等来确保可靠性
- 路由机制:支持主流的订阅消费模式,如广播,订阅,headers 匹配等
- 扩展性:多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
- 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用。
- 多种协议:RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP,MQTT 等多种消息中间件协议。
- 多语言客户端:RabbitMQ 几乎支持所有常用语言,比如 Java、Python、Ruby、PHP、C#、JavaScript 等。
- 管理界面:RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
- 插件机制:RabbitMQ 提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。
主要应用场景
异步处理
将业务中属于非核心或不重要的流程部分,使用消息异步通知的方式发给目标系统,这样主业务流程无需同步等待其他系统的处理结果,从而达到系统快速响应的目的。
应用解耦
基于消息订阅机制实现业务扩展,例如:电商下单场景,用户下单之后,产生一条订单消息,然后仓库模块订阅订单消息发货、积分模块可以订阅订单消息增加积分、短信模块可用订阅订单消息发送短信等等。
流量削峰
因为上下游系统之间处理流量的能力存在差异,消息队列可以起到调节作用,让下游系统可以匀速处理流量。
例如:
以支付订单成功,通知仓库发货为例,如果目前订单模块支持1000的并发,仓库发货支持100的并发,这种上游订单模块支持较高的并发,下游仓库模块支持较低的并发,并发处理能力之间存在差异,如果下单后直接通知仓库发货,仓库模块会挂掉,那么可以引入消息队列,订单支付成功后,产生订单消息,仓库模块可以订阅订单消息,慢慢排队发货。
ps: 跟排队挤地铁是一个意思。