作支付平台的时候。须要实现接受上游支付消息,通知给下游渠道。 针对下游渠道:要实现 按通知次数 递进 延时通知 下游渠道的支付/签约/代扣的状态html
可参考微信按照 15/15/30/180/1800/1800/1800/1800/3600 单位s 等5个level去通知下游业务端微信
当时采用rabbitmq死信队列实现延时消息的通知: 当一个消息过时后,会自动变成死信。若是消息绑定了dead letter change,那么消息过时后会被转发到相应队列。从而实现消息延迟消费post
rabbitmq的延时消息分为两类(https://www.rabbitmq.com/ttl.html):spa
当两种都设置的时候,过时时间按照小的生效。最开始采用 per message TTL即每一个消息的过时时间不一致。可是发现这样一个现象3d
问题:当delay_queue中的消息的过时时间不一致的时候,rabbitmq处理机制从性能角度考虑按照FIFO,当queue头元素未过时时候,后面即便有已通过期的消息时候,htm
消息也不会立刻变成死信队列。而被consumer消费,从而致使了delay_queue消息堆积,消息长时间不被消费的现象。blog
解决: 采用相似于rocketmq的解决方案。不能级别的延时放在不一样queue,即delayMs=1000 一个queue,delayMs=2000 一个queue。这样保证同一个queue中的消息过时时间一致。rabbitmq
从而解决消息堆积问题。 具体实现很简单:队列