RabbitMQ介绍

介绍

RabbitMQ是 一个由erlang语言编写的、开源的,基于AMQP协议实现的消息队列,具有MQ应用解耦、流量削峰、异步的特点

官网地址 https://www.rabbitmq.com/

功能特点

支持顺序消息,保证消息送达消费端的前后顺序
支持消息补偿,重试,以及快速定位异常、失败消息
支持集群负载均衡
支持消息路由策略,指定某些消息路由到指定的队列

架构图

在这里插入图片描述

概念

Message

消息。由消息头消息体组成。消息体是不透明的,而消息头则由一系列可选属性组成,这些属性包括:routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出消息可能持久性存储)等。

Publisher

消息的生产者。也是一个向交换器发布消息的客户端应用程序。

Consumer

消息的消费者。表示一个从消息队列中取得消息的客户端应用程序。

Exchange

交换器。 Exchange是一个比较重要的概念,它是消息到达RabbitMQ的第一站,主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅了相关Queue的消费者消费到指定的消息。

当我们创建好Exchange和Queue之后,需要使用Routing key(通常叫作Binding key)将它们绑定起来,producer在向Exchange发送一条消息的时候,必须指定一个Routing key,然后Exchange接收到这条消息之后,会解析Routing key,然后根据Exchange和Queue的绑定规则,将消息分发到符合规则的Queue中

在这里插入图片描述

分发消息的规则有6种

simple(简单)

只涉及生产者、队列、消费者
生产者负责生产消息,将消息发送到队列中,消费者监听队列,队列有消息就进行消费,消费成功后,自动从队列中删除。有可能造成消息的丢失

worker(工作)

只涉及生产者、队列、消费者
工作队列模式其实就是有多个消费者的简单模式。C1,C2 共同争抢当前的消息队列内容,谁先拿到谁负责消费消息
一条消息只能被消费一次

direct(直连)

direct的意思是直接的,direct类型的Exchange会将消息转发到指定Routing key的Queue上,Routing key的解析规则为精确匹配。也就是只有当producer发送的消息的Routing key与某个Binding key相等时,消息才会被分发到对应的Queue上。

在这里插入图片描述

假设向交换机MY_DIRECT_EXCHANGE中发送一条消息,消息的Routing key是ORDER,那么该条消息仅会被投递到MY_DIRECT_ORDER_QUEUE这个队列

fanout(广播)

fanout是扇形的意思,该类型通常叫作广播类型。fanout类型的Exchange不处理Routing key,而是会将发送给它的消息路由到所有与它绑定的Queue上

在这里插入图片描述

假设向交换机MY_FANOUT_EXCHANGE中发送一条消息,消息的Routing key任意填写一个值,该消息会被投递到三个队列中,所以 fanout类型的Exchange不管Routing key是什么,它都会将接收到的消息分发给所有与自己绑定了的Queue上。

topic(主题,规则匹配)

topic的意思是主题,topic类型的Exchange会根据通配符对Routing key进行匹配,只要Routing key满足某个通配符的条件,就会被路由到对应的Queue上。通配符的匹配规则如下:

  1. Routing key必须是一串字符串,每个单词用“.”分隔;
  2. 符号“#”表示匹配一个或多个单词;
  3. 符号“*”表示匹配一个单词。

eg:

“*.123” 能够匹配到 “abc.123”,但匹配不到 “abc.def.123”;“#.123” 既能够匹配到 “abc.123”,也能匹配到 “abc.def.123”

我们向交换机发送的消息会根据Routing key的匹配结果,路由到对应的消息队列

headers (Arguments参数)

headers Exchange中,Exchange与Queue之间的绑定不再通过Binding key绑定,而是通过Arguments绑定 。

producer在发送消息时可以添加headers属性,Exchange接收到消息后,会解析headers属性

只要Binding配置的Arguments中的所有属性全部被包含在Headers中并且值相等,那么这条消息就会被路由到对应的Queue中

Binding

绑定。用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

Queue

消息队列。用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取走。

Routing-key

路由键。RabbitMQ 决定消息该投递到哪个队列的规则。队列通过路由键绑定到交换器。消息发送到 MQ 服务器时,消息将拥有一个路由键,即便是空的 ,RabbitMQ 也会将其和绑定使用的路由键进行匹配。如果相匹配,消息将会投递到该队列。如果不匹配,消息将会进入黑洞。

Connection

链接。指 rabbit 服务器和服务建立的 TCP 链接。 每个producer(生产者)或者consumer(消费者)要通过RabbitMQ发送与消费消息,首先就要与RabbitMQ建立连接,这个连接就是Connection。Connection是一个TCP长连接。

Channel

1.Channel 中文叫做信道,是 TCP 里面的虚拟链接。例如:电缆相当于 TCP,信道是一个独立光纤束,一条 TCP 连接上创建多条信道是没有问题的。

​ 2.TCP 一旦打开,就会创建 AMQP 信道。

​ 3.无论是 声明Queue、声明Exchang、 发布消息、接收消息、订阅队列,这些动作都是通过信道完成的。

Virtual Host

虚拟主机。 一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker时,可以创建自己单独的Virtual host,然后在自己的Virtual host中创建Exchange和Queue,很好地做到了不同用户之间相互隔离的效果。 vhost 是AMQP 概念的基础,必须在链接时指定,RabbitMQ 默认的 vhost 是/。

在这里插入图片描述

Broker

表示消息队列服务器实体。

AMQP协议

AMQP协议本身分三层:

Moudle Layer:位于协议的最高层,主要定义了一些客户端的命令,客户端利用这些命令实现自己的业务逻辑。例如客户端使用Queue.Declare命令声明一个队列,或者使用Basic.Consume订阅消费一个队列的消息。

Session Layer:位于中间层,主要负责客户端命令发送给服务器,再将服务器应答返回客户端,主要为客户端和服务器之间通信提供可靠性同步机制和错误处理。

Transport Layer:位于最底层,主要传输二进制流,提供帧处理,信道复位,错误检测。

参考文章

https://baijiahao.baidu.com/s?id=1732891548341088166&wfr=spider&for=pc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值