我应该使用简单的延迟还是指数退避

时间:2011-08-09 06:14:49

标签: .net architecture timeout

我有一个基本上执行进程的分布式系统(不是OS进程,只是需要完成的事情)。经过一些不成功的尝试(超时)后,它会通知失败。

我想继续尝试在后台执行该过程,问题是:我应该使用更长的超时时间吗?或者越来越大的超时(每次尝试越来越大)

  • 进程失败的原因有很多,主要是网络问题。

3 个答案:

答案 0 :(得分:3)

这取决于第一次尝试失败的原因。

如果是由于某些资源的潜在过载/暂时耗尽,您可能需要尝试一些exponential back off策略。原因是,不断尝试获得你想要的东西会使事情变得更糟,因此可能永远不会取得成功。

如果您基本上等待某些事情发生或可用,例如正在打开的端口或存在的文件(基本上是“轮询”),您可能只想等待一段固定的时间。

这有点过于简单,但可能会提供一些基本的想法。只要确保你彻底测试你选择的任何策略(或它们的组合),以确保它(显然)实际上有效并且也不会恶化任何东西。

答案 1 :(得分:2)

我认为第一个选择是更好的选择,因为如果你在每次尝试时都会变得越来越大,那么如果你在1小时失败后1分钟开始下一次尝试可能在1天之后......! 1-> 2, 2 -> 4, 4 -> 8, 8 -> 16..

我将采用第一种方法并定义合理的超时。

答案 2 :(得分:2)

如果有多种原因导致失败,可能会选择重新设计流程,使其能够在出现问题后继续