利用RabbitMq的TTL time-to-live 来实现延时消费。
延时时间设置到每条消息上的。而不是给队列的。
实现方式为消息存活时间为动态用户页面可配置的。
这就导致了一个问题:
先用一条消息的存活时间是1天。后面又进了一条消息存活时间是1小时。
结果一小时到了,发现这条消息并没有被转发到消费延时过期消息的队列。
原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从头部开始的。
它不会检测每一条消息是否过期。而是顺序检测。
如果first in的消息过期时间很长,会导致它阻塞后进的消息。
不仅无法实现真正的过期时间。还会导致,一个大的过期时间的先进的消息,会堆积一堆后进的过期时间短的消息。
当先进的这条消息过期转发时,后面的消息会瞬间都被转发。造成消费延时过期消息的队列瞬间被转发进来大量消息。
造成消费压力。
所以rabbitmq ttl适用于过期时间一致的延时消费。
对于动态的延时可变的情况,还是考虑定时任务实现。
如果各位网友有其他好的办法欢迎探讨