3.两种模式与交换机和队列的属性

5.两种模式

5.1.Confirm介绍

消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker的exchange中,这也是消息可靠性投递的重要保障

img

5.2.Confirm使用

5.2.1.环境搭建

①选择依赖

image-20230604101436598

②修改启动类

image-20230604101548283

③修改配置

image-20230604102114929

④绑定交换机

image-20230604102019836

5.2.2.普通写法

①回调类编写

image-20230604103910653

②发送消息

image-20230604103934819

③访问测试

不管是否正确的将消息发送到交换机,交换机都会返回一个结果

错误时

image-20230604103952868

正确时

image-20230604104110784

5.2.3.匿名内部类写法

①发送消息

在发送消息直接编写回调函数即可

image-20230604105656068

②测试

错误时

image-20230604105857592

正确时

image-20230604105927034

5.2.4.lambda写法

①发送消息

在发送消息直接编写回调函数即可

image-20230604110327159

②测试

错误时

image-20230604110434308

正确时

image-20230604110409372

5.3.Return介绍

rabbitmq 整个消息投递的路径为:producer —> exchange —> queue —> consumer

消息从producerexchange 则会返回一个confirmCallback(confirm模式);

消息从exchangequeue投递失败则会返回一个returnCallback(return模式);

5.4.Return使用

和确认模式一样,可以写成匿名内部类,lambda表达式等写法

5.4.1.选择依赖

image-20230604111116780

5.4.2.修改启动类

image-20230604111257053

5.4.3.修改配置

image-20230604111903316

5.4.4.编写回调函数类

image-20230604111929987

5.4.5.发送消息

image-20230604111951091

5.4.6.测试

image-20230604112042560

6.交换机和队列参数

交换机和队列是在发送消息之后才进行创建

6.1.交换机参数

1.Name:交换机名字

2.Type:交换机类型,有direct, topic, fanout, headers四种

3.Durability:持久化,声明交换机是否持久化,代表交换机在服务器重启后是否还存在

4.Auto delete:是否自动删除,曾经有队列绑定到该交换机,后来解绑了,那就会自动删除该交换机

5.Internal:内部使用的,如果是yes,客户端无法直接发消息到此交换机,它只能用于交换机与交换机的绑定

6.Arguments:只有一个取值alternate-exchange,表示备用交换机

6.2.备用交换机

6.2.1.备用交换机使用场景

当消息经过交换器准备路由给队列的时候,发现没有对应的队列可以投递信息,在rabbitmq中会默认丢弃消息,如果我们想要监测哪些消息被投递到没有对应的队列,我们可以用备用交换机来实现,可以接收备用交换机的消息,然后记录日志或发送报警信息。

image-20230604114721485

备用交换机一般使用fanout交换机

p指定的路由key为hello,但是正常的交换机指定的路由key是info,所以正常交换机要指定一个备用交换机(使用fanout不用指定路由key)

6.2.2.使用

①选择依赖

image-20230604115621354

②修改配置

image-20230604115841075

③修改启动类

image-20230604115848037

④发送消息

image-20230604120414620

⑤绑定交换机

image-20230604120617884

⑥访问测试

image-20230604120637426

路由key错误就会进入到备用交换机

image-20230604120647812

6.3.队列参数

Type:队列类型

Name:队列名称

Durability:声明队列是否持久化,代表队列在服务器重启后是否还存在

Autodelete: 是否自动删除,如果为true,当没有消费者连接到这个队列的时候,队列会自动删除

Exclusive:exclusive属性的队列只对首次声明它的连接可见,并且在连接断开时自动删除;基本上不设置它,设置成false

Arguments:队列的其他属性,例如指定DLX(死信交换机等)

  1. x-expires:Number(单位毫秒)

    • 当Queue(队列)在指定的时间未被访问,则队列将被自动删除
  2. x-message-ttl:Number

    • 发布的消息在队列中存在多长时间后被取消
  3. x-overflow:String

    • 在死信队列的时候使用过
    • 队列溢出行为,当达到队列的最大长度时,消息会发生什么,有效值为Drop Head或Reject Publish
      1. Drop Head:当队列已满时,新消息将排在队列的“头部”,旧的消息将从“尾部”开始删除。
      2. Reject Publish:当队列已满时,RabbitMQ 将拒绝任何请求将新消息发布到队列中。
  4. x-max-length:Number

    • 队列所能容下消息的最大长度,当超出长度后,新消息将会覆盖最前面的消息,类似于Redis的LRU算法
  5. x-single-active-consumer:默认为false

  • 是否激活单一的消费者,也就是该队列只能有一个消息者消费消息;
  1. x-max-length-bytes:Number

    • 限定队列的最大占用空间,当超出后也使用类似于Redis的LRU算法
  2. x-dead-letter-exchange:String

    • 指定队列关联的死信交换机,有时候我们希望当队列的消息达到上限后溢出的消息不会被删除掉,而是走到另一个队列中保存起来
  3. x-dead-letter-routing-key:String

    • 指定死信交换机的路由键,一般和6一起定义
  4. x-max-priority:Number(0-255取值范围)

    • 如果将一个队列加上优先级参数,那么该队列为优先级队列

    • 给消息加上优先级属性,通过优先级特性,将一个队列实现插队消费

      MessageProperties messageProperties=new MessageProperties();  messageProperties.setPriority(8);
      
  5. x-queue-mode:String(理解下即可)

    • 队列类型x-queue-mode=lazy懒队列,在磁盘上尽可能多地保留消息以减少RAM使用,如果未设置,则队列将保留内存缓存以尽可能快地传递消息;
  6. x-queue-master-locator:String(用的较少)

    • 在集群模式下设置队列分配到的主节点位置信息
posted @   22-10-21  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示