1、架构图:

2、RabbitMQ 的优点:
- 基于 ErLang 语言开发具有高可用高并发的优点,适合集群服务器
- 健壮、稳定、易用、跨平台、支持多种语言、文档齐全
- 有消息确认机制和持久化机制,可靠性高
- 开源
3、ErLang语言的特点
调度
这是最重要的:没有调度,并发实体根本不能称之为并发实体。操作系统中 CPU 是由内核管理的,调度算法是基于时间片来调任务的,内核随时可以剥夺一个任务的 CPU 使用权这就是“抢占”。这一点非常重要,没有这个功能就意味着调度是不公平的。一个任务耗费大量 CPU 会把另个一任务给饿死。但是在用户空间(应用层)很难实现这一点,毕竟 CPU 是不受应用程序的控制的,没有把办法剥夺。抢占看似可有可无,但是没有它就没有“公平调度”,也就谈不上并发。(有任务撑死,有任务饿死)
所谓“公平调度”
比如写两个 Actor,使用无限循环输出字符串(while(true))会疯狂的吃 CPU,如果是可抢占的公平调度,则 actor1 和 actor2 应该是比较有规律的交替(大家得到的 CPU 时间差不多)
Java 中的 任务
test1
test1
test1
...
test2
test2
test2
...
test1
...
ErLang
test1
test2
test1
test2
test1
test2
test1
test2
...
ErLang 非常均匀的任务切换,实现了“可抢占的公平”
RabbitMQ 的概念
生产者和消费者
Producer:消息的生产者
Consumer:消息的消费者
Queue
消息队列,提供了 FIFO 的处理机制,具有缓存消息的能力。RabbitMQ 中,队列消息可以设置为持久化,临时或者自动删除。
设置为持久化的队列,Queue 中的消息会在 Server 本地硬盘存储一份,防止系统 Crash,数据丢失
设置为临时队列,Queue 中的数据在系统重启之后就会丢失
设置为自动删除的队列,当不存在用户连接到 Server,队列中的数据会被自动删除
ExChange
Exchange 类似于数据通信网络中的交换机,提供消息路由策略。RabbitMQ 中,Producer 不是通过信道直接将消息发送给 Queue,而是先发送给 ExChange。一个 ExChange 可以和多个 Queue 进行绑定,Producer 在传递消息的时候,会传递一个 ROUTING_KEY,ExChange 会根据这个 ROUTING_KEY 按照特定的路由算法,将消息路由给指定的 Queue。和 Queue 一样,ExChange 也可设置为持久化,临时或者自动删除
ExChange 的 4 种类型
direct(默认):直接交换器,工作方式类似于单播,ExChange 会将消息发送完全匹配 ROUTING_KEY 的 Queue(key 就等于 queue)
fanout:广播是式交换器,不管消息的 ROUTING_KEY 设置为什么,ExChange 都会将消息转发给所有绑定的 Queue(无视 key,给所有的 queue 都来一份)
topic:主题交换器,工作方式类似于组播,ExChange 会将消息转发和 ROUTING_KEY 匹配模式相同的所有队列(key 可以用“宽字符”模糊匹配 queue),比如,ROUTING_KEY 为 `user.stock` 的 Message 会转发给绑定匹配模式为 `* .stock,user.stock`, `* . *` 和 `#.user.stock.#` 的队列。( * 表是匹配一个任意词组,# 表示匹配 0 个或多个词组)
headers:消息体的 header 匹配,无视 key,通过查看消息的头部元数据来决定发给那个 queue(AMQP 头部元数据非常丰富而且可以自定义)
Binding
所谓绑定就是将一个特定的 ExChange 和一个特定的 Queue 绑定起来。ExChange 和 Queue 的绑定可以是多对多的关系
Virtual Host
在 RabbitMQ Server 上可以创建多个虚拟的 Message Broker,又叫做 Virtual Hosts (vhosts)。每一个 vhost 本质上是一个 mini-rabbitmq server,分别管理各自的 ExChange,和 bindings。vhost 相当于物理的 Server,可以为不同 app 提供边界隔离,使得应用安全的运行在不同的 vhost 实例上,相互之间不会干扰。Producer 和 Consumer 连接 rabbit server 需要指定一个 vhost
RabbitMQ的使用过程
客户端连接到消息队列服务器,打开一个 Channel。
客户端声明一个 ExChange,并设置相关属性。
客户端声明一个 Queue,并设置相关属性。
客户端使用 Routing Key,在 ExChange 和 Queue 之间建立好绑定关系。
客户端投递消息到 ExChange。
ExChange 接收到消息后,就根据消息的 key 和已经设置的 binding,进行消息路由,将消息投递到一个或多个队列里
2022-03-01:
消息队列的应用场景


消息队列是改变了服务之间调用的通信方式,使用消息队列可以极大的提供业务代码所花费的时间,在很多场景下,消息队列是非常好用的!
当前消息队列中间件的介绍
- Kafka 适用于大数量,对功能要求不高的应用场景
- RabbitMQ 适用于功能要求高、而且还注重公平调度原则的应用场景
什么是公平调度: 比如多条线程之间,可以非常公平的进行切换: A B A B...
- 没有中转站的ZeroMQ,该消息队列被设计成是一个Socket API
关于RabbitMQ中的虚拟主机的概念
为了让多个项目组同时使用RabbitMQ服务器,可以在服务器中创建多个虚拟主机,每个项目组使用一个虚拟主机就可以解决冲突的问题
