RabbitMQ简介
RabbitMQ(Rabbit Message Queue),是由Erlang语言编写的,实现了高级消息队列协议(AMQP--Advanced Message Queuing Protocol)的开源消息代理软件。
RabbitMQ官网:https://www.rabbitmq.com/
其结构图如下:
- Publisher:消息发布者
- Connection:与RabbitMQ建立连接
- Channel:通道,在客户端里每个连接里,可建立多个channel,一个channel代表一个对话
- Broker:提供一种传输服务,维护生产者-服务端-消费者的路线,保证数据完整的传输
- Virtual Host:虚拟主机,一个broker可以有多个vHost,分离不同权限的用户
- Binding:把exchange和queue按照路由规则绑定起来
- Exchange:消息交换机,接收消息并把消息路由到队列中
- Queue:消息队列载体,一个消息可以投入到一个或多个队列。是消息的容器,也是消息的终点
- Consumer:消息消费者
RabbitMQ的应用场景:
- 异步处理:将消息写入消息队列后直接返回,等需要时再进行处理。
- 流量削峰:秒杀或团抢活动中使用。服务器在接收用户请求后,先写入消息队列。加入消息队列长度超过最大数据量,直接跳转到错误页面。这样可以控制访问人数,避免短时间内的高流量导致系统超负荷而崩溃。
- 应用解耦:以电商为例,下单流程为:创建订单--->减库存--->仓库发货。若采用传统的方式,下单的过程需要等待调用商品服务返回调用结果,如果因网络原因使得商品服务减库存失败或者延迟,会带来较差的用户体验。假设减库存时操作报错,没有事务回滚的话还会造成数据不一致。在高并发的场景下显然是不合理的。采用消息队列的机制,消息发送者不用等待消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,网络不通时,消息暂存在队列中,当网络畅通时再转发给相应的应用程序或服务进行下一步操作。既提高了并发量,也降低了服务间的耦合度。
- 日志处理:系统中有大量业务需要日志,但不要求实时性,可以采用消息队列来处理
- 消息通讯
RabbitMQ的特点:
- 可靠性:通过队列持久化、交换器持久化
- 灵活扩展:多个RabbitMQ可组成一个集群,队列可以在集群中的机器上设置镜像
- 管理界面:RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面
- 支持多语言:RabbitMQ几乎支持所有的编程语言
- 插件机制:RabbitMQ 提供了许多插件,可以来从多方面进行扩展