延时任务如何精确处理

1.背景

延时任务如何精确处理,比如下单后10分钟没有支付,就必须取消订单。假如一个订单的下单时间是上午10:00,那么10:10必须做到该订单被处理。如果有成千上万的订单都是这种情况,怎么做到都能够这样处理?

2.方案思路

一般情况下,待执行的任务,都是存储到关系型数据库中,这个现状会自然的影响我们做出下面的解决方法:轮询。
轮询:采用轮询的方案,假如执行轮询的是一个执行者(单个进程或者单个线程),如何合理地设置轮询周期是一个非常难的事情,设置长了,会造成不精确执行延时任务,设置短了,会造成计算资源的浪费和对线上正常存储等服务造成多余的压力威胁。

轮询优化:创建更多的轮询的执行者,相应的也要把所有的待延时执行的任务进行重新划分成多个不会相互交叉的子任务,其实就是并行的解决并行的任务,这就引出了如何对任务分片并设计调度的问题。这样稍微解决了延时任务的精确执行的问题,但是计算资源的使用上没有明显改善。

如果采用了新的解决思路(抛开对任务相关的现状的依赖而进行思考),那么你可能会想到把任务放到队列中。
任务一定有先后的顺序,那么可以采用队列进行排队,但是什么时候精确唤醒任务并被精确执行,这个精确唤醒是问题的关键和难点。
通过借助RabbitMQ可以实现延时队列。具体的优势劣势要调研可以得出。

你可能感兴趣的:(并发,RabbitMQ,思想总结)