这篇本文主要讲解作业不断失败并重试,导致解决方案雪崩,关于雪崩效应解决的相关题,希望能对大家都有帮助。
在开发项目中,大家通常会使用类似Mq的消息中间件产品或者开发自己的定时任务来进行数据处理。
大致流程如下有时我会去数据库获取有效的任务,然后在任务运行完成后将其删除或将任务设置为过期。
这可能会导致称为“雪崩效应”的潜在风险。
想象一下以下场景有预定任务。每一秒,它都会去数据库,获取第一个创建的有效任务,然后执行该任务。获取最早创建的任务的原因是,如果获取的是最近创建的任务,则可能永远没有机会执行前面的任务。
如果这个任务出现题,执行失败,上游调度系统会继续获取有题的任务,继续重试。
这会导致两个题首先,这些有题的任务总是占用计算资源并影响其他任务的正常执行。第二点是,如果重试间隔很短,这可能会产生雪崩效应,导致系统崩溃。
那么如何避免呢?
当然,最暴力的方法不是获取第一个创建的任务,而是随机获取任务。
但总的来说,我们希望任务尽可能有序地运行,但我们不想陷入这些有题的任务中。网络题可能会导致一两次失败,但也可能会出现多次失败。这通常意味着出现了错误,您不需要继续重试,您必须手动处理它。
所以我们希望能够做到这一点。随着任务重试次数的增加,任务重试的可能性变得越来越小。
如果是这样,更好的方法是根据操作的重试次数对重试时间进行一些非线性处理。任务重试间隔最初是恒定的,然后是线性的,达到一定次数后变得非线性。
具体SQL如下
valid=1andupdate_timelt;=DATE_SUBnow,INTERVALretry_count-1retry_count-2retry_count-3+2retry_count+1SECOND按IDasc排序limit100间隔t和重试次数r请参阅以下表达式。tr=ar-1r-2r-3+br+c
最初,r=0,因此间隔是常数c。在接下来的3次重试中,之前的多项式都为0。然后,重试间隔随b线性增加,然后快速非线性增加到三次方。很优雅。我们的需求得到了满足。
或者添加一个名为next_retry_time的新字段并构建索引。如果操作失败,请通过上面的公式计算出代码中的间隔时间,然后加上当前时间,写入next_retry_time,改为next。稍后做什么
valid=1和next_retry_timelt;现在从id升序为100的任务排序中进行选择。战斗结束了!
-------------
转载自我的同名csdn博客。
一、雪崩击穿和隧道击穿的特征和发生条件?
雪崩击穿当施加在PN结上的反向电压变得足够大时,PN结中的自由电子数量迅速增加,导致反向电流迅速增加,引起击穿。
齐纳击穿在PN结两端添加高浓度的镁也会使反向电流迅速增大,在不太高的反向电压作用下引起击穿。
热击穿施加在PN结两端的电压与流过PN结的电流的乘积大于PN结允许的功率损耗。PN结因无法散热而烧毁。
热破坏和电破坏之间的区别电破坏是可逆的,而热破坏是不可逆的。
二、雪崩效应的词语解释?
爬山时,不要向山边扔石头。
首先,一块从数千英尺高处落下的小石头具有令人难以置信的破坏力。其次,小而不显眼的石头最多只能击中几块。如果有足够多的岩石落下,过不了多久就会有一大块岩石松动并开始滑落。从那时起,这些小石头就会引起雪崩。这个事实就像滴水穿石一样显而易见。蝴蝶效应是指微小因素的变化,但往往威力极大,最终改变整个结构,产生意想不到的结果。现在,如果您将这一原则应用到业务和技术中,您也可以取得类似的结果。商业和技术本身都有一定的结构和系统,当人们适当地拆除和重组这些结构时,它们可以释放出巨大的能量。这确实是令人难以置信的能量。雪崩摧毁了旧的工业体系,有时导致整个工业完全消失。雪崩带来的巨大压力,彻底打乱了商业与技术之间的本质联系,迫使我们拥抱新的变革和融合,最终将引发一系列变革性的革命。
在Redis中,所谓的SETNX代表“SETifNoteXists”,意思是仅在不存在时才设置。可以用这个来达到锁定的效果,但是很多人没有意识到SETNX有陷阱。
例如,某些查询数据库的接口由于多次调用而添加缓存,并设置缓存过期后刷新。题是当并发量比较大,没有锁机制的时候。缓存过期的瞬间,大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。如果您有锁定机制,则可以仅控制一个缓存更新请求,并让其他请求等待或使用过期的缓存,具体取决于情况。
让我们以PHP社区中最流行的扩展之一PHPRedis扩展为例来实现演示代码。
上面的代码完美吗?案还差得很远!如果请求更新缓存的时间较长,或者超过锁的有效期,则在缓存更新过程中锁会失效。此时,另一个请求获取了锁,但是前一个请求获取了锁。缓存更新后请求也会更新。如果完成后不进行判断而直接释放锁,则会意外释放其他请求创建的锁,因此在创建锁时需要引入一个随机值。
No Comment