原生 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(发布确认)
作为消息中间件,都会⾯临消息丢失的问题.
消息丢失⼤概分为三种情况:
-
⽣产者问题.因为应⽤程序故障,⽹络抖动等各种原因,⽣产者没有成功向broker发送消息.
-
消息中间件⾃⾝问题.⽣产者成功发送给了Broker,但是Broker没有把消息保存好,导致消息丢失.
-
消费者问题.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 )发送消息

消费者

