场景
电商购物时,30 分钟未支付订单,让订单自动失效
实现<br>
RocketMQ
定义 18 个延时级别,每个延时级别对应一个延时时间
生产者把消息发送到 Broker 后,Broker 首先把消息保存到 SCHEDULE_TOPIC_XXXX 这个 Topic
然后调度任务会判断是否到期,如果到期,会把消息从 SCHEDULE_TOPIC_XXXX 取出投递到原始的 queue,这样消费者就可以消费到了
<br>
旧版本的消息只支持最大两个小时的延时,RocketMQ5.0基于时间轮算法实现了定时消息
Pulsar
延时消息首先会写入一个 Delayed Message Tracker 的数据结构中
Delayed Message Tracker 根据延时时间构建 delayed index 优先级队列
消费者拉取消息时,首先去 Delayed Message Tracker 检查是否有到期的消息。如果有则直接拉取进行消费
<br>
RabbitMQ
方式一:投递到普通队列都不消费,等消息过期后被投递到死信队列,消费者消费死信队列
<br>
方式一:生产者发送消息时,先发送到本地 Mnesia 数据库,消息到期后定时器再将消息投递到 broker
Kafka
方式一:可以通过生产者拦截器来实现消息延时发送
方式一:定义延时 Topic,利用类似 RocketMQ 的方案来实现延时消息