1、DB轮询
优点:简单、无技术难点、异常恢复、支持分布式/集群环境; 缺点: 影响数据库性能;
优点: 实现简单、性能好;
缺点: 异常恢复困难、只适用于单机环境,分布式/集群实现困难;
3、Redis
优点: 解耦、异常恢复、支持分布式/集群环境;
缺点: 增加Redis维护、占用宽带、增加异常处理;
4、RabbitMQ
优点: 解耦、异常恢复、扩展性强、支持分布式/集群环境;
缺点: 增加RabbitMQ维护、占用宽带;
二、JDK延迟队列
DelayQueue无界阻塞队列,延迟期满时才获取元素,放DelayQueue对象需实现Delayed接口
System.out.println(sdf.format(new Date())+ " Thread "+Thread.currentThread()+" 添加了一个delay. orderId:"+orderId+i)
System.out.println(sdf.format(new Date())+" Thread "+Thread.currentThread()+" 消费了一个delay. orderId:"+delayed.getOrderId());
三:Redis 有序集合
订单超时时间戳与订单号分别设置为score与member,系统扫描第一个元素判断是否超时。
com.five.delay.utils.RedisUtils //扫描redis 判断订单是否超时需要处理
System.out.println(sdf.format(new Date())+"["+Thread.currentThread()+"] 从redis中拿到一个超时任务[key:"+key+", score:"+score+", member:"+element+"]");
四:RabbitMQ TTL+DLX
RabbitMQ可设置消息过期时间(TTL),当消息过期后,将该消息投递到队列上设置死信交换器(DLX)上,再次投递到死信队列中,重新消费。