rabbitMQ是erlang语言开发,所以运行RabbitMQ之前必须下载版本合适的erlang。
RabbitMQ
RabbitMQ是一个基于AMQP协议实现的消息队列中间件,可以实现异步处理,流量削峰,系统解耦。
消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信 。
排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
AMQP协议
即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等
四大核心概念
- 生成者:
- 产生数据发送消息的程序是生产者。
- 交换机
- RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定
- 队列
- 消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据
- 消费者
- 一个队列中的消息只能被一个消费者接收;同一条消息被交换机发给多个队列,那么这条消息可以被多个消费者接收。
- 消费者只能接收消息,分发到具体的处理者,消费者本身不处理消息。
RabbitMQ组件
ConnectionFactory(连接管理器):应⽤程序与Rabbit之间建⽴连接的管理器,程序代码中使⽤。
Channel(信道):消息推送使⽤的通道。
Exchange(交换器):⽤于接受、分配消息。
Queue(队列):⽤于存储⽣产者的消息。
RoutingKey(路由键):⽤于把⽣成者的数据分配到交换器上。BindingKey(绑定键):⽤于把交换器的消息绑定到队列上。
使用场景
-
解耦
- 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
- 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
- 实现订单系统与库存系统的应用解耦 , 在下单时库存系统不能正常使用。也不影响正常下单,因为下单 后,订单系统写入消息队列就不再关心其他的后续操作 , 为了保证库存肯定有,可以将队列大小设置成库存数量
-
异步提升效率
-
流量削峰
- 秒杀活动 , 每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求
- 高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可
RabbitMQ 6种模式
-
simple简单模式
- 消息产生者将消息放入队列,消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除
- 隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失
-
work工作模式(资源的竞争)
- 消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息
- 高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用
- 应用场景:红包;大项目中的资源调度
-
publish/subscribe发布订阅(共享资源)
- 消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费
- 应用场景:邮件群发,群聊天,广播(广告)
-
routing路由模式
- 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
- 使用场景: 错误、异常通知,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;
-
topic 主题模式(路由模式的一种)
- 路由功能添加模糊匹配,消息产生者产生消息,把消息交给交换机,交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费
-
RPC(不是MQ)
Springboot集成RabbitMQ
三大常用模式
Fanout(发布订阅)模式、Direct( 路由 ) 模式、Topic (主题)模式
Fanout模式
-
pom文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test