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 )发送消息

消费者

相关推荐
传感器与混合集成电路1 小时前
面向储气库注采井的分布式光纤监测技术
分布式
ZTLJQ2 小时前
任务调度的艺术:Python分布式任务系统完全解析
开发语言·分布式·python
被摘下的星星2 小时前
Hadoop伪分布式集群搭建实验原理概要
大数据·hadoop·分布式
无名-CODING5 小时前
Java 爬虫高级技术:反反爬策略与分布式爬虫实战
java·分布式·爬虫
8Qi85 小时前
Redis哨兵模式(Sentinel)深度解析
java·数据库·redis·分布式·缓存·sentinel
爱学习的程序媛6 小时前
JWT签发全指南:从原理到安全实践
分布式·安全·web安全·安全架构·jwt签发·无状态认证
wanhengidc7 小时前
徐州服务器租用的优势
大数据·运维·服务器·分布式·智能手机
wanzehongsheng8 小时前
分布式光伏电站的技术优势与智能运维实践:以WZ HELIO²双轴跟踪系统为例
运维·分布式
爱浦路 IPLOOK8 小时前
分布式UPF架构:让低时延与大带宽不再是难题
分布式·架构
rafael(一只小鱼)8 小时前
如何解决报错wmic不是内部或外部命令--kafka场景下
windows·分布式·kafka