RabbitMQ介绍
1:RabbitMQ是什么
1.1:协议
RabbitMq是基于AMPQ协议的一种 消息中间件
1.2:名词解析
RabbitMQ 内部结构:
①:Message
消息主要包括两部分,分别为 消息头、消息体。
消息头的一些可选属性如RoutingKey(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等都可在发布消息时设置。
消息体也就是payload,不透明的。
②:Exchange
交换机。和队列成绑定关系。主要职责就是将消息分配到队列。
③:Publisher
消息发送端,通常指发送消息的应用程序。
④:Consumer
消息消费端,通常指消费消息的应用程序。
⑤:Binding
用于消息队列和交换机进行关联匹配。
⑥:Queue
消息队列,用于存储消息的载体。
⑦:Connection
网络连接,如TCP、AMQP 连接。
⑧:Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
⑨:Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
tip:当mq模式为topic时,同ExchangeName同QueueName不能使用不同的routingKey
2:RabbitMQ的几种作用
①:削峰
适用于实时性不高,大批量请求的场景。
比如10086群发百万级的中秋节祝福短信。
②:异步
适用于主要业务和其他业务进行分离的场景。
比如在用户进行注册时,用户信息的插入肯定是同步的,但是用户的账户开通邮件可以是异步的。
③:解耦
3:RabbitMQ的几种模式
3.1:fanout 模式
类似于广播的作用。
生产者将消息发送到某个队列,凡是绑定该队列的消费者都将消费这个消息。
3.2:direct 模式
具有分食的作用。
生产者将消息发送到某个队列,绑定该队列的所有消费者将各自消费这个消息,
该消息指派给某个消费者并确认消费后,不会再派发给其他消费者。
3.3: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']的消息。
3.4: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}的消息。
4:JAVA中如何使用RabbitMQ
消费者构建过程
![drawing](https://img2020.cnblogs.com/blog/1537140/202009/1537140-20200927172722863-1972891439.png)
生产者构建过程
![drawing](https://img2020.cnblogs.com/blog/1537140/202009/1537140-20200927172840032-1078298500.png)
初始化ConnectionFactroy 代码:
![drawing](https://img2020.cnblogs.com/blog/1537140/202009/1537140-20200927172926785-952409091.png)