大家在开发工程中,一般都使用过类似Mq的消息中间件产品,或者自己开发处理数据的定时任务。
它们一般的流程都是:每隔一段时间,去数据库获取有效的任务,然后执行,执行完成之后,删除任务或者将任务设置为失效。
那么这就可能存在一个潜在的风险:“雪崩效应”。
试想一下如下场景:我有个定时任务,每隔1s去数据库获取最早创建的并且有效的任务,然后执行任务。之所以获取最早创建的,是因为如果获取最新的任务,那么旧的任务可能就一直没机会执行了。
如果这个任务有问题,执行失败了,就会导致上游调度系统不断的获取到这条问题任务,不断的进行重试。
这会导致两个问题,第一,这个问题任务会一直占用计算资源,影响其他任务的正常执行。第二点,如果重试间隔时间很短,这个任务会产生雪崩效应,导致系统崩溃。
那么我们怎么避免呢?
最暴力的方法当然是,获取任务不是获取最早创建的,而是采用随机的方式。
但是,一般来说,我们还是希望任务能够尽量的顺序执行的,只是不希望被这样的问题任务给