马拉松退赛 - 真的是指数吗?

时间:2017-08-23 22:06:31

标签: marathon

我正试图找出Marathon的指数退避配置。这是文档:

  

将backoffSeconds和backoffFactor值相乘,直到达到maxLaunchDelaySeconds值。在达到该值后,Marathon会等待maxLaunchDelaySeconds,然后以指数方式重复此循环。例如,如果backoffSeconds:3,backoffFactor:2和maxLaunchDelaySeconds:3600,将有10次尝试启动失败的任务,每次尝试相隔3秒。在这十次尝试之后,Marathon将在重复此循环之前等待3600秒。

我认为指数退避的方式是等待期应该是:

3 * 2 ^ 0 = 3

3 * 2 ^ 1 = 6

3 * 2 ^ 2 = 12

3 * 2 ^ 3 = 24等等

因此每次应用程序崩溃时,Marathon都会等待更长时间再重试。但是,鉴于上面的描述,Marathon的等待逻辑看起来像这样:

int retryCount = 0;
while(backoffSeconds * (backoffFactor ^ retryCount) < maxLaunchDelaySeconds)
{
   wait(backoffSeconds);
   retryCount++;
}
wait(maxLaunchDelaySeconds);

这符合文档中的说明,因为3 * 2 ^ x&lt; 3600表示x的值小于或等于10.但是,我真的不知道它是如何被称为指数退避,因为等待时间是恒定的。

有没有办法让Marathon每次重启时都会等待更长时间?我误解了医生吗?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

据我了解RateLimiter.scala中的代码,它就像你描述的那样,但后来限制在maxLaunchDelay等待期间。我们说maxLaunchDelay是一小时(3600s)

  1. 3 * 2 ^ 0 = 3
  2. 3 * 2 ^ 1 = 6
  3. 3 * 2 ^ 2 = 12
  4. 3 * 2 ^ 3 = 24
  5. 3 * 2 ^ 4 = 48
  6. 3 * 2 ^ 5 = 96
  7. 3 * 2 ^ 6 = 192
  8. 3 * 2 ^ 7 = 384
  9. 3 * 2 ^ 8 = 768
  10. 3 * 2 ^ 9 = 1536
  11. 3 * 2 ^ 10 = 3072
  12. 3 * 2 ^ 11 = 3600(6144)
  13. 3 * 2 ^ 12 = 3600(12288)
  14. 3 * 2 ^ 13 = 3600(24576)
  15. 这给我们带来了典型的2 ^ n图表,请参阅graph

    如果你有其他的backoffFactors,你会获得更大的增长,

    例如退避因子10: backoff factor 10

    或退避因素20: backoff factor 20

    此外,我看到了此主题的重新设计,代码审核目前在此处打开:https://phabricator.mesosphere.com/D1007

    您怎么看?

    由于 约翰内斯