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")
表示当满足以下条件时才会生效:
- 配置文件中存在以
spring.rabbitmq.listener.simple.retry
开头的属性。 - 对应的属性名为
enable
。 - 属性值为
"true"
。
只有当以上三个条件都满足时,@ConditionalOnProperty
注解修饰的 Bean 或组件才会被创建或加载。
在保证消息的可靠性之后
我们引入了延迟消息,假设用户下单后迟迟没有付款,通过定时任务会消耗mysql的性能,我们指定在下单三十分钟后查询一次,如果还没支付,就取消订单。
因此延迟消息很有用。
第一种实现方案
第二种方案,使用官方插件 但是使用定时就一定需要消耗cpu资源,在mq中使用延迟消息只适用于时间较短的时候,因为如果时间长了,并发量大了,就会影响性能