(三)延迟任务处理方案

1、DB轮询

优点:简单、无技术难点、异常恢复、支持分布式/集群环境; 缺点: 影响数据库性能;

2、DelayedQueue

优点: 实现简单、性能好;

缺点: 异常恢复困难、只适用于单机环境,分布式/集群实现困难;

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)上,再次投递到死信队列中,重新消费。 

https://github.com/smallFive55/delayMessage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。