RabbitMQ介绍及其工作模式

什么是RabbitMQ

AMQP(高级消息队列协议)是一个通用的应用层协议,提供主要的消息服务的协议,为面向消息服务的中间件.基于此协议的客户端和消息队列进行传递消息,不会受客户端,中间件,开发语言等因素影响,后面RabbitMQ中定义的交换机,队列等概念都是这个协议中的提出的,AMQP的模型结构和rabbitMQ是一样的.

rabbitMQ是基于AMQP协议的消息服务的中间件,是主流的消息中间件之一.

同步与异步通信

MQ(message queue)字面理解就是一个队列,但是里面存储的是消息,消息可以非常简单,可以是文本字符串也可以是JSON.

同步通信就是客户端在发送完消息后,服务端就直接接收到消息.

异步通信就是将消息先转发到RabbitMQ中,再由MQ broker转发到服务端.

RabbitMQ的工作流程

Connection和Channel

Connection(连接)表示连接当创建一个connection时,此时就相当于客户端和消息队列之间创建了一个TCP连接,此时数据的传输和信息控制都基于它.

Channel(通道)是连接上的一个抽象层,一个连接上可以存在多个channel,消息的接收和发送都基于通道.

简单理解就是一个连接表示一个TCP连接,传输数据都是依赖它,但是每次发送消息都需要创建一个连接过于消耗资源,所以在连接的基础上创建一个更加小的单位来表示一次连接,一个连接有多个信道.

Virtual Host ,Queue 和 exchange

Virtual Host(虚拟主机)是mq中的一种数据隔离机制,类似于MySQL中的表,当有多个用户同时使用一个borkerserver时,就可以使用virtual host表示每一个用户,每一个虚拟机上都可以有多个交换机和队列.

Queue(队列)是真正用于存储消息的空间.

Exchange(交换机)表示当消息传到虚拟机上时,此时交换机就会根据一定规则来进行分配消息给队列.

那么一次消费信息其实就可以分为:生产者发送消息 , 开启一个连接,再开启一条信道 , 通过这个信道传到交换机上 , 交换机将任务分配到相应的队列上 , 消费者将信息从队列中取出.

交换机类型:

1)Direct直接交换机:生产者发送消息的时候会指定一个目标队列的名字,交换机就会看看绑定的队列中有没有匹配的队列,会将队列中添加消息.

2)Fanout扇出交换机:交换机会将所有绑定本交换机的队列中都添加一份消息.

3)Topic主题交换机:生产者在发送消息的时候会指定一个rountingkey,队列和交换机绑定的时候也会指定一个bindingkey,如果rountingkey和bindingkey相同此时这条消息就发给对应的队列.

RabbitMQ的管理界面

我们可以使用rabbitMQ的服务器IP地址加默认端口号(15672)来访问rabbitMQ的管理界面.

可以通过管理界面更加清楚的观察到虚拟机,队列,交换机之间的关系.

也可以对其中的配置进行权限的设置,这在后面使用代码操作rabbitMQ后观察效果尤其重要.

RabbitMq的七种工作模式

引入依赖:

复制代码
<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.20.0</version>
        </dependency>

在RabbitMQ的官方文档中一共有七种工作模式,接下来分别介绍并使用Java模拟实现.

1)simple(简单模式)

一个消费者一个生产者一个消息队列

生产者:

创建一个通信工厂,以此设定rabbitmq的服务器IP,端口,登录所需的密码和用户名,还有虚拟机,从连接中取出一个信道,接下来需要根据这个信道进行通信,接下来需要声明交换机和队列,可以不设定交换机,当不声明交换机时,接下来就会使用默认的交换机.

最后使用basicpublish发送消息.

消费者:

消费者同样需要将从信道连接到队列,与生产者不同的是这里的消费消息需要使用basicconsume,同时需要创建一个defaultconsume回调函数得到队列中的消息.

运行结束后需要将连接关闭,信道是建立在连接上的,先关闭连接再关闭信道就会报错.

2)Work工作模式:

来自MQ官方的解释,工作模式就是多个消费者同时订阅一个队列.

消费者1,2:

生产者:

两个消费者需要进行同时订阅同一个队列.

3)publish(发布订阅模式)

生产者:

生产者中需要声明交换机,同时声明交换机的类型,因为使用的是扇出模式的交换机,所以不需要指出两个key,交换机会将消息发送给所有绑定交换机的队列.

同时需要将两个队列绑定到声明的交换机.

消费者:

4)Rounting(路由模式)

生产者:

direct类型的交换机类型需要指定rounting和bindingkey,此时队列获取消息就需要匹配.

消费者:

5)Topic(分配法模式)

生产者:

这里的rountingkey和bingingkey匹配是以通配符的形式匹配的.

6)Publisher confirms(发布确认模式)

发布确认模式其实是rabbit MQ的一钟应答机制,属于RMQ的一种工作模式.

在MQ发送消息的过程中可能会出现一些错误,而发布确认模式就是针对生产者向RMQ服务器发送过程中进行一个保障机制.

⽣产者将信道设置成confirm(确认)模式, ⼀旦信道进⼊confirm模式, 所有在该信道上⾯发布的消息都 会被指派⼀个唯⼀的ID(从1开始), ⼀旦消息被投递到所有匹配的队列之后, RabbitMQ就会发送⼀个确认 给⽣产者(包含消息的唯⼀ID), 这就使得⽣产者知道消息已经正确到达⽬的队列了, 如果消息和队列是可 持久化的, 那么确认消息会在将消息写⼊磁盘之后发出. RMQ回传给⽣产者的确认消息中.

发布确认有三种策略:单独确认,批量确认,异步确认.

单独确认:发送一条消息之后就等待服务端的返回,是一种串行同步的等待方式.

批量确认:发送一批的消息后再等待服务端确认.

异步确认:提供一个回调方法,服务端确认了⼀条或者多条消息后客⼾端会回这个⽅法进⾏处理.

相关推荐
会周易的程序员2 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
青山木15 小时前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
szephyr19 小时前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
lisanmengmeng1 天前
分布式追踪与监控:Skywalking介绍(一)
分布式·skywalking
HanhahnaH1 天前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
rustfs1 天前
MinIO 国产开源平替正式 GA
分布式·docker·云原生·rust
螺蛳粉 螺蛳粉1 天前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
孙启超1 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
九皇叔叔1 天前
Seata——把分布式事务理论落到 Java 微服务实践
分布式·分布式事务·cap·base·saga