方案一:死信队列 + 消息TTL

这个方案利用消息的过期时间(TTL)死信交换机(DLX)。消息过期后会被自动转发到一个“死信队列”中,我们只需要监听这个死信队列,就能在指定时间后处理超时订单

架构流程:生产者 -> 普通交换机 -> 设置了TTL和DLX的普通队列 ->(消息过期)-> 死信交换机 -> 死信队列 -> 消费者(执行关单)

优点:基于RabbitMQ原生特性,稳定可靠
缺点:如果队列头部有长时间未过期的消息,会阻塞后面已过期的消息,导致延迟不精确每条消息的超时时间必须相同(队列级TTL)或通过expiration属性设置,但存在前述的阻塞问题。

方案二:延迟消息插件

RabbitMQ官方提供了一个插件 rabbitmq_delayed_message_exchange。启用后,我们可以声明一种新的交换机类型 x-delayed-message,消息发送时在Header中指定延迟时间,到达时间后才会投递到队列

架构流程:生产者 -> 延迟类型交换机(消息在此等待)-> 普通队列 -> 消费者(执行关单)

总结

方案一(死信队列)经典,方案二更加灵活。

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注