RabbitMQ基本概念

RabbitMQ基本介绍

RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用,2007年,Rabbit技术公司基于 AMQP标准开发的 RabbitMQ 1.0 发布。

RabbitMQ基本特点

  • 高可靠性、易扩展、高可用、功能丰富

  • 支持大多数的编程语言客户端。

  • RabbitMQ遵循AMQP协议,自身采用Erlang编写。

  • RabbitMQ也支持MQTT等其他协议

  • RabbitMQ也具有很强大的插件扩展能力,

  • RabbitMQ支持万级流量,并且消息延迟是微秒级

RabbitMQ整体架构

全网最详细RabbitMQ基本概念_后端

RabbitMQ架构成员概念

Producer(生产者)

消息生产者

Consumer(消费者)

消息消费者

Connection

生产者/消费者 和 broker 之间的 TCP连接

Channel

Channel 是在 connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的 channel 进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel 之间是完全隔离的。Channel 作为轻量级的Connection极大减少了操作系统建

Brokder

接收和分发消息的应用,RabbitMQ Server就是 Message Broker

Virtual host

出于多租户和安全因素设计的,把AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQserver 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost创建exchange/queue 等

Exchange(交换机)

message 到达broker的第一站,根据分发规则,匹配查询表中的routingkey,分发消息到queue 中去。常用的类型有:direct (point-to-point),topic (publish-subscribe) andfanout (multicast)等交换机

Queue(队列)

消息最终被送到这里等待 consumer 取走

Binding

exchange 和queue 之间的虚拟连接,binding 中可以包含routingkey。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据

RabbitMQ Exchange类型

RabbitMQ的交换器类型有:fanout、direct、topic、headers。

fanout交换机

fanout交换机会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

全网最详细RabbitMQ基本概念_RabbitMQ_02

如图所示,fanout交换机下面有3个绑定到该交换机队列,那么消息发送后,交换机会把消息发送到每个队列中。如果消费者不在线,那么不在线期间发送过来的消息则收不到,上线后也收不到,只有在线状态才能收到消息,相当于广播,播放一声,如果在线就知道,不在线也就不知道了。

direct交换机

direct类型的交换器路由规则很简单,它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。

全网最详细RabbitMQ基本概念_消息发送_03

如图所示,直接交换器通过路由key和绑定key是否完全匹配,如果完全匹配,则一定会到指定的队列中,如果路由key和绑定key不匹配,则进入不了对应的队列中。消费者只有消费符合规则的消息。

topic交换机

topic类型的交换器在direct匹配规则上进行了扩展,也是将消息路由到BindingKey和RoutingKey相匹配的队列中。

topic的匹配规则跟direct匹配规则不一样,topic约定:BindingKey和RoutingKey一样都是由"."分隔的字符串;BindingKey中可以存在两种特殊字符“”和“#”,用于模糊匹配,其中""用于匹配一个单词,"#"用于匹配多个单词(可以是0个)。

全网最详细RabbitMQ基本概念_消息路由_04

headers交换机

headers类型的交换器不依赖于路由键的匹配规则来路由信息,而是根据发送的消息内容中的headers属性进行匹配。

在绑定队列和交换器时指定一组键值对,当发送的消息到交换器时,RabbitMQ会获取到该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果匹配,消息就会路由到该队列。headers类型的交换器性能很差,基本上不推荐使用。