目录
一、简介
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
最初起源于金融系统,适用于对数据的一致性、稳定性和可靠性要求比较高的场景。
二、作用
缓解高并发场景的压力;对流量进行削峰;实现解耦;提高系统的可靠性
三、AMQP协议
1. 简介
AMQP高级消息队列协议(Advanced Message Queueing Protocol),是面向消息的中间件的开
放标准应用层协议,AMQP的特征是消息导向,排队,路由(包括点对点和发布和订阅),可靠性
和安全性。
AMQP要求消息传递提供商和客户端的行为在不同供应商实现可互操作的情况下,以与SMTP,
HTTP,FTP等相同的方式创建了可互操作的系统。
AMQP协议是具有现代特征的二进制协议。一个提供统一消息服务的应用层标准高级消息队列协
议,是应用层协议的一个开发标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件
可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
AMQP是一种二进制应用层协议,旨在有效地支持各种消息应用和通信模式。
2. 核心概念
AMQP协议模型
1、Server
又称作Broker,用于接受客户端的连接,实现AMQP实体服务;
2、Connection
连接,应用程序与Broker的网络连接;
3、Channel
网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立
多个Channel,每个Channel代表一个会话任务;
3、Message
消息,服务器和应用程序之间传送的数据,有Properties和Body组成。Properties可以对消息进行
修饰,比如消息的优先级、延迟等高级特性;Body则是消息体内容,即我们要传输的数据;
仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection
创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包
含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个
客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP
连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程
之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共
用Connection。
4、Virtual Host
虚拟地址,是一个逻辑概念,用于进行逻辑隔离,是最上层的消息路由。一个Virtual Host里面可
以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或者Queue;
Virtual Host是权限控制的最小粒度;
5、Exchange
交换机,用于接收消息,可根据路由键将消息转发到绑定的队列;
6、Binding:
Exchange和Queue之间的虚拟连接,Exchange在与多个Message Queue发生Binding后会生成一
张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到
Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将
Message路由到Message Queue。Binding Key由Consumer在BindingExchange与Message
Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange
Type决定
7、Routing Key:
一个路由规则,虚拟机可用它来确定如何路由一个特定的消息;
8、Queue:
也称作Message Queue,即消息队列,用于保存消息并将他们转发给消费者;
RabbitMQ整体架构图
四、工作原理
Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚 拟的分组中,类
似于网络中的namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,
可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:publisher/consumer 和 broker 之间的 TCP 连接
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候 建立 TCP
Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如
果应用程序支持多线程,通常每个 thread 创 建单独的 channel 进行通讯,AMQP method 包含了
channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。
Channel 作为轻 量级的Connection 极大减少了操作系统建立 TCP connection 的开销
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发
消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout
(multicast)
Queue:消息最终被送到这里等待 consumer 取走
Binding:exchange 和queue 之间的虚拟连接,binding 中可以包含 routing key, Binding 信息被
保存到exchange 中的查询表中,用于 message 的分发依据
简单来说:
1、生产者发送消息到MQ交换机
2、交换机根据定义的绑定规则和传过来的key将消息放到不同队列中
3、消费者从队列中取出消息进行消费
五、工作模式
让我们看看官网:RabbitMQ tutorial - "Hello World!" | RabbitMQ
经过官网文档介绍,我们知道RabbitMQ的工作模式有七种
Hello Wold 简单模式/普通模式
Work queues 工作队列模式
Publish/Subscribe 发布订阅模式
Routing 路由模式
Topics 主题模式
RPC 远程调用模式
Publisher Confirms 发布确认模式
1. 普通模式
2. Worker模式
类似于RocketMQ集群模式,发送消息只有一个消费者去消费。prefetchCount默认预取250个
消息,可以在配置文件中配置预取消息数量,实现各个节点多劳多得。消费速度快的就可以消费更
多的消息。
spring.rabbitmq.listener.simple.prefetch=自定义预取数量
3. PubSub模式
类似于RocketMQ广播模式,所有消费者都会收到消息。
生产者需要指定交换机,不需要指定队列。type ="fanout"
4. Rounting模式
根据指定的交换机及路由key来发送消息,
即消费者绑定了与生产者发布的消息相同的路由key时才可以收到消息。
5. Topic模式
Rounting模式的一种,交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息
消费
6. RPC模式
远程过程调用或RPC
7. Publisher Confirms模式
六、基本结构
七、常见五个角色
- publisher:生产者
- consumer:消费者
- exchange:交换机,负责消息路由
- queue:队列,存储消息
- virtualHost:虚拟主机,隔离不同用户的exchange、queue、消息的隔离