基础篇有人写的很好了,放个链接:
https://blog.csdn.net/weixin_73077810/article/details/133836287?spm=1001.2014.3001.5506
发送者可靠性
生产者重连
生产者确认
MQ的可靠性
数据持久化
RabbitMQ实现数据持久化包括3个方面:
- 交换机持久化
- 队列持久化
- 消息持久化
PageOut会使得消息队列阻塞,但消息一直是持久化的话,只是效率稍微低一些,不会阻塞。
Lazy Queue
消费者的可靠性
消费者确认机制
消费失败处理
失败重试机制
用第三种比较好:
业务幂等性
在程序开发中,幂等性指的是同一个业务,执行一次或多次对业务状态的影响是一致的。
方案一:唯一消息 id
用 Jackson2JsonMessageConverter 自动生成 id
缺点:性能上有影响,业务处理方的工作会变得复杂。
方案二:业务判断
结合业务逻辑,基于业务本身做判断。
例如:要在支付后修改订单状态为已支付,应该在修改前先查询订单状态,判断是否为未支付。只有未支付的订单才需要修改,其他状态不做处理(要特别注意多种状态时,哪种状态需要修改)。
这个要多看看,用 update 是怎么优化的
延迟消息
生产者发送消息时,指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。
应用场景:订单支付(超时)
需要注意的是:延时消息对cpu的消耗较大,只适合延时时间相对较短的场景。
死信交换机
当一个队列中的消息满足以下情况之一,就会成为死信( dead letter ):
- 消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 requeue 参数设置为 false
- 消息是一个过期消息(达到了队列或消息本身设置的过期时间),超时无人消费
- 要投递的队列消息堆积满了,最早的的消息可能成为死信
如果队列通过 dead-letter-exchange 属性指定了一个交换机,那么该队列中的死信就会投递到这个交换机中,这个交换机就被称为死信交换机(Dead Letter Exchange,简称DLX)。
延迟消息插件(推荐)
官方推出了一个插件,原生支持延迟消息功能。
该插件的原理是设计了一种支持延迟消息功能的交换机,当消息投递到交换机后可以暂存一定时间,到期后再投递队列。(需要手动安装)
取消超时订单
解决方法:将30min拆分成短的时间
最后一节的代码可以多看看。