1、前言
学习一门技术,首先要知道它能帮我们解决哪些问题,带着这个疑问去探索可以事半功倍。
痛点1:
业务复杂,需要同步调用多个系统的接口,总耗时较长,用户体验差。
痛点2:
比如系统A需要和多个系统交互,如果其它系统改变或者新增系统,那么A系统就需要改代码,这样系统之间耦合度较高。
总结:
消息中间件最大的作用就是:异步处理、系统解耦; 此外还可以作为消息广播、流量控制。
2、相关概念
我们根据架构原理图上涉及到的来看:
- 生产者(Publisher):发送消息的应用。
- 消费者(Consumer):接收消息的应用。
- 连接(Connection):它使用TCP进行可靠的传输,连接RabbitMQ和应用服务器。
- 信道(Channel):连接里的一个虚拟通道,通过消息队列发送或者接收消息时,都是通过信道进行的。Connection内部建立的逻辑连接,通常每个线程创建单独的Channel。
- 交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息队列里。换种理解:快递分拣中心。
- 队列(Queue):它们存储应用程序发送的消息。
- 代理(Broker):接收和分发消息的应用,RabbitMQ Server就是Message Broker。
- 消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
- 绑定(Binding):绑定是交换机用来将消息路由到队列的规则。
- 路由键(Routing Key):消息的目标地址。换种理解:寄快递填写的地址。
- 虚拟主机(Virtual host):出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue 等。
3、灵魂——Exchange
交换机是RabbitMQ的核心组件,交换机接收消息并将其路由到零个或多个队列中。所使用的路由算法取决于绑定的交换类型和规则。Exchange有以下4种:
Name(交换机类型) |
Default pre-declared names(预声明的默认名称) |
Direct exchange(直连交换机) |
(Empty string) and amq.direct |
Fanout exchange(扇型交换机) |
amq.fanout |
Topic exchange(主题交换机) |
amq.topic |
Headers exchange(头交换机) |
amq.match (and amq.headers in RabbitMQ) |
3.1直连交换机
直连交换机根据消息路由键将消息传递到队列,队列使用路由键K绑定到交换机。当具有路由键R的新消息到达直连交换机时,如果K = R,则交换机将其路由到队列。
如果多个队列绑定到具有相同路由键K的直连交换机,则交换机将消息路由到K = R的所有队列。
3.2 扇出交换机
扇出交换机将消息路由给绑定到它身上的所有队列,而忽略路由键。如果有N个队列绑定到一个扇出交换机,当新消息发布到该交换机时,该消息的副本将被传递到这N个队列。
3.3主题交换机
主题交换机通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。
- * 表示匹配任意一个单词
- # 表示匹配任意个数单词
主题交换器非常强大,可以像其他类型的交换器一样工作:
- 当一个队列的绑定键是"#"是,它将会接收所有的消息,而不再考虑所接收消息的路由键,就像是fanout交换器一样;
- 当一个队列的绑定键没有用到”#“和”*“时,它又像direct交换一样工作。
3.4头交换机
头交换机是根据消息header值而不是routing key将消息路由到队列的交换器。
生产者在消息头中以键值对的形式添加一些值,并将其发送到headers exchange,收到消息后,headers exchange尝试将所有或任何(基于x-match的值)header值与绑定到它的所有队列的值匹配。 如果找到匹配,则将消息路由到绑定值匹配的队列,如果未找到匹配,则忽略该消息。
当"x-match"参数被设置为"any"时,只要一个匹配的头值就足够了。或者,将“x-match”设置为“all”要求所有值必须匹配。
4、控制台
这里就不说安装搭建了,百度一下吧。直接来看一看RabbitMQ的控制台:
也是在管理页面创建我们的虚拟机和用户。
这里我们新建一个虚拟机和用户,后续使用。
新建一个用户,账号密码自定义。
用户添加后可以看到他没有可以访问的虚拟机,点击用户名进入设置
把虚拟机demo分配给此用户
下一篇整合SpringBoot来实际使用RabbitMQ。