RabbitMQ学习(2)

 

 

 说白了无非两种情况,返回ack说明消息成功被broker接收了,无需处理

返回nack说明消息传输时失败了,mq没有正常处理,这个时候我们在回调函数里面重发消息

 mq保证可靠性

首先要保证交换机和队列的持久化的前提

然后要保证数据的持久化

如果发送的message是非持久化的,那么就会在内存上存储,一旦内存达到阈值,就会pageout,pageout将内存数据持久到磁盘的期间进程是堵塞的,那么就会带来消息丢失

解决的第一种方式是数据持久化,当message是持久的类型时,在内存和磁盘都会保存一份,

第二种方式的Lazy Queue,惰性队列直接将消息存储至磁盘,消费者消费的时候才会读取并加载至内存

 

 

 

 

 

@ConditionalOnProperty 是 Spring Boot 中的一个条件注解,用于根据配置属性的值来决定是否加载或配置某个 Bean 或组件。

在给定的示例中,@ConditionalOnProperty(prefix = "spring.rabbitmq.listener.simple.retry", name = "enable", havingValue = "true") 表示当满足以下条件时才会生效:

  1. 配置文件中存在以 spring.rabbitmq.listener.simple.retry 开头的属性。
  2. 对应的属性名为 enable
  3. 属性值为 "true"

只有当以上三个条件都满足时,@ConditionalOnProperty 注解修饰的 Bean 或组件才会被创建或加载。

 

 

 

 在保证消息的可靠性之后

我们引入了延迟消息,假设用户下单后迟迟没有付款,通过定时任务会消耗mysql的性能,我们指定在下单三十分钟后查询一次,如果还没支付,就取消订单。

因此延迟消息很有用。

 第一种实现方案

第二种方案,使用官方插件 但是使用定时就一定需要消耗cpu资源,在mq中使用延迟消息只适用于时间较短的时候,因为如果时间长了,并发量大了,就会影响性能

 

 

 

posted @ 2024-01-17 22:34  -她的梦-  阅读(18)  评论(0编辑  收藏  举报