RabbitMQ 工作模式实现

原生 API 实现

1. 简单模式

一个消费者,一个生产者;(见包simple_Queues)

如果 p 生产了 10 条消息,c 就可以消费 十条消息

2. 工作模式

一个生产者,多个消费者;(见包 Work_Queues)

如果p 生产了 10 条消息,由 c1 和 c2 共同承担;(程序先启动两个消费者在启动 生产者;防止生产者先启动,被某一个消费者启动的瞬间消费了);

消费者接收消息和打印消息是 多线程 进行的

3. Publish/Subscribe(发布/订阅)

这里的 x 是 Exchange(交换机);

Exchange 常⻅有三种类型,分别代表不同的路由规则

a) Fanout:

⼴播-----将消息发给所有和 交换机 绑定的 队列;

b) Direct:

定向----把消息交给符合指定routingkey的队列(Routing模式)

c) Topic:

通配符-----把消息交给符合routingpattern(路由模式)的队列(Topics模式)

RoutingKey:

路由键.⽣产者将消息发给交换器时,指定的⼀个字符串,⽤来告诉交换机应该如何处理这个消息.

Binding Key

:绑定.RabbitMQ中通过Binding(绑定)将交换器与队列关联起来,在绑定的时候⼀般会指定⼀个BindingKey, 这样RabbitMQ就知道如何正确地将消息路由到队列了.

4. Routing(路由模式)

在生产者中的 声明交换机步骤的 exchangeDeclare方法中,可以设置 交换机类型;

**Direct:**消息按routingKey精确匹配到绑定了相同路由键的队列

**Fanout:**消息广播到所有绑定该交换机的队列,忽略routingKey

topic **:**消息按routingKey模糊匹配(支持*匹配单个词、#匹配多个词)

headers **:**不依赖routingKey,通过消息头属性的键值对匹配(性能较低)

5. 通配符模式

6.RPC 通信

将生产者消费者替换为了 客户端服务器

7.Publisher Confirms(发布确认)

作为消息中间件,都会⾯临消息丢失的问题.

消息丢失⼤概分为三种情况:

  1. ⽣产者问题.因为应⽤程序故障,⽹络抖动等各种原因,⽣产者没有成功向broker发送消息.

  2. 消息中间件⾃⾝问题.⽣产者成功发送给了Broker,但是Broker没有把消息保存好,导致消息丢失.

  3. 消费者问题.Broker发送消息到消费者,消费者在消费消息时,因为没有处理好,导致broker将消费 失败的消息从队列中删除了

发布确认模式,解决的是 生产者 发送消息丢失的问题;

生产者既可以发送消息,又可以异步等待 确认消息;

1. 单独确认策略

每发发送一条消息,就需要单独确认,耗时时间长;

2. 批量确认策略

3. 异步确认策略

生产者 每发送一个消息,就记录这个消息的 id 存储在 集合中,服务器 每返回一个 ack (接收消息的id)就删除 集合中对应的 id;

如果接收到的是 批量的,就需要将小于等于 deliveryTag 的集合删除,表示序号已经被 ack了

Spring框架实现

工作队列模式

yml 配置

常量

这里声明 交换机和 队列 名称

声明队列

这里声明队列,用 @Configuration 和 @Bean 将 声明队列的 类和方法 交给 spring 管理;

Queue 和 QueueBuilder 的路径 要注意,来自 springframework 包

Durable():方法的作用是,持久化,将,参数是队列名;

这里如果指向声明对象,也可以使用其他方法;

Build():方法的作用是,将所有属性打包成一个对象;

生产者

RabbitTemplate类 定义了 RabbitMQ 消息发送的完整流程规范【连接管理、信道复用、消息转换、资源回收】

convertAndSend()方法 将"建立连接→开启信道→转换消息→发送消息→释放资源" 的全流程简化执行

消费者

@ RabbitListener 注解详解

如果在 消费者中使用string接收消息:

下图使用 Message接收

在 日志中 发现,消息的唯一id(deliveryTag)只在 单个消费者内部是唯一的,而在多个消费者之间是可以 重复的

=======================================================================

发布订阅模式

引入了交换机,有三种常见类型;

1.生产者代码

1 )声明队列

2 )声明交换机

3 )声明交换机和队列的绑定

4 )发送消息

1. 消费者 代码

=========================================================================

路由模式

将消息发给符合指定 routingKey 的队列;

1 )声明队列

2 )声明交换机

3 )声明交换机和队列的绑定

.4 )发送消息

消费者

=========================================================================

通配符模式

*:表示一个单词

#:表示多个单词

topics 模式需要使用的交换机类型给 = topic (在声明时使用)

1 )声明队列

2 )声明交换机

3 )声明交换机和队列的绑定

.4 )发送消息

消费者

相关推荐
Mr.朱鹏1 小时前
分布式-redis哨兵模式架构
数据库·redis·分布式·spring·缓存·架构·java-ee
河码匠1 小时前
rabbitmq 基本操作
rabbitmq
电气铺二表姐137744166151 小时前
智能虚拟电厂系统 分布式能源集中调度 支持多协议并网控制
分布式·能源
珠海西格1 小时前
工商业分布式光伏:西格防逆流方案如何适配高负荷波动场景?
大数据·服务器·分布式·云计算·能源
云姜.2 小时前
RabbitMQ 核心概念
分布式·rabbitmq
lalala_Zou2 小时前
RabbitMQ如何保证消息可靠性
分布式·rabbitmq
Chan162 小时前
从生产到消费:Kafka 核心原理与实战指南
java·spring boot·分布式·spring·java-ee·kafka·消息队列
鱼骨不是鱼翅2 小时前
个人简历面试复习-----rabbitmq篇(一)
面试·职场和发展·rabbitmq
泯仲2 小时前
RabbitMQ的延迟消息在项目中的运用及实现剖析
开发语言·后端·rabbitmq