延迟任务
延迟任务 什么是延迟任务 顾明思议,把需要延迟执行的任务叫做延迟任务
延迟任务得使用场景
订单下单之后 30 分钟后,用户如果没有付钱,系统需要自动取消订单,并退还库存 如何定期检查处于退款状态的订单是否已经退款成功 重试机制实现:把调用失败的接口放入一个固定延时的队列,到期后再重试 新创建的店铺:如果在十天内都没有上传过商品,则自动发送消息提醒 用户发起退款:如果三天内没有得到处理则通知相关运营人员 预定会议后:需要在预定的时间点前十分钟通知各个与会人员参加会议 关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之 清理过期数据业务:比如缓存中的对象,超过了空闲时间,需要从缓存中移出 多考生考试:到期全部考生必须交卷,要求时间非常准确的场景 任务超时处理:在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求 订餐通知:下单成功后60s之后给用户发送短信通知 红包 24 小时未被查收,需要延迟执退还业务 每个月账单日,需要给用户发送当月的对账单 延迟任务实现思路 延迟任务实现的关键是在某个时间节点执行某个任务。基于这个信息可以想到实现延迟任务的手段有以下两个:
自己手写一个“死循环”一直判断当前时间节点有没有要执行的任务 借助 JDK 或者第三方提供的工具类来实现延迟任务 通过 JDK 实现延迟任务能想到的关键词是:DelayQueue、Timer、ScheduledExecutorService 第三方提供的延迟任务执行方法就有很多了,例如:Redis、Netty、MQ 等手段 实现方式 定期轮询(数据库等) JDK(DelayQueue、Timer、ScheduledExecutorService周期性线程池) 时间轮(Kafka、Netty的HashedWheelTimer) Redis有序集合(zset) Zookeeper之curator MQ(RabbitMQ) Quartz,xxxjob等定时任务框架 Koala(考拉) JCronTab(仿crontab的java调度器) SchedulerX(阿里) 有赞延迟队列 …… 轮询 特点:定期轮训数据库,设置状态
优点:实现简单
缺点:
对服务器内存消耗大 存在轮询延迟 数据量过大时会消耗太多的IO资源,效率太低 DelayQueue 特点:无界、延迟、阻塞队列
优点:JDK自带,轻量级,使用简单
缺点:
[Read More]