1:RabbitMQ是什么
协议
RabbitMq是基于AMPQ协议的一种 消息中间件
消息路由过程
简单路由
RabbitMq 拿到消息之后,会先交给 交换机 (Exchange), 然后交换机再根据预先设定的不同绑定( Bindings )策略,来确定要发给哪个队列。
灵活路由
根据 RoutingKey 和 Arguments 来灵活匹配队列
ExchangeName(交换机名称)+QueueName(队列名称)+RoutingKey+Arguments(头部属性) 四种属性组合确定最终消费队列。
tip:当mq模式为topic时,同ExchangeName同QueueName不能使用不同的routingKey
2:RabbitMQ的几种作用
削峰
适用于实时性不高,大批量请求的场景。
比如10086群发百万级的中秋节祝福短信。
异步
适用于主要业务和其他业务进行分离的场景。
比如在用户进行注册时,用户信息的插入肯定是同步的,但是用户的账户开通邮件可以是异步的。
解耦
3:RabbitMQ的几种模式
fanout 模式
类似于广播的作用。
生产者将消息发送到某个队列,凡是绑定该队列的消费者都将消费这个消息。
direct 模式
具有分食的作用。
生产者将消息发送到某个队列,绑定该队列的所有消费者将各自消费这个消息,
该消息指派给某个消费者并确认消费后,不会再派发给其他消费者。
topic 模式
类似于订阅的作用。
生产者将消息发送到某个队列,但队列中存在订阅了不同的topic(routingKey)的消费者,
这些消费者只会消费自己订阅了的topic的消息。
比如consumer_a 在‘bac’队列订阅了topic='rk.a'的消息,那么他只会收到topic='rk.a'的消息。
比如consumer_b 在‘bac’队列订阅了topic='rk.b'的消息,那么他只会收到topic='rk.b'的消息。
比如consumer_c 在‘bac’队列订阅了topic='rk.*'的消息,那么他只会收到topic=['rk.a','rk.b']的消息。
header 模式
在一堆条件中具有任意匹配和全匹配的作用。
比如consumer_a 在‘bac’队列绑定了header={'id':1,"gz":2}的消息,
匹配模式是'any',那么收到的消息可以为header={'id':1,"gz":2} 或者 header={'id':1,"gz":1}的消息。
匹配模式是'all',那么收到的消息只能为header={'id':1,"gz":2}的消息。