FCM:重试后和指数退避

时间:2017-06-09 11:45:52

标签: firebase firebase-cloud-messaging retry-logic exponential-backoff

据我了解,当邮件无法传递时,Retry-After标头有时会包含在响应中,有时则不包括在内。但是如果我第一次收到包含Retry-After的错误响应,重新发送消息并收到另一个错误响应但没有Retry-After会怎样?我知道我应该使用指数退避,但是当前一个等待时间来自Retry-After标头时,它是如何工作的?

想象一下这一系列的请求和回应:

Request 1: No waiting
Response 1: Error without Retry-After
Request 2: Wait 2 seconds
Response 2: Error with Retry-After included (let's say 120 seconds)
Request 3: Wait 120 seconds
Response 3: Error without Retry-After
Request 4: How long should I wait? 

在发送请求4之前我应该​​等多久? 8秒?或者从2秒开始?

1 个答案:

答案 0 :(得分:2)

AFAIK,指数退避并不是一种标准的方式或间隔。

然而,通常遵循的是,对于每个连续的不成功请求,等待间隔应该比前一个更长,但如果它是第一个错误响应(例如,先前的请求成功),它应该恢复为默认值值(您设置的值,例如2秒)。

一个例子是这样的。

Request 1: No waiting
Response 1: Error without Retry-After
Request 2: Wait 2 seconds // assume 2seconds is your default
Response 2: Error with Retry-After included (let's say 120 seconds)
Request 3: Wait 120 seconds
Response 3: Error without Retry-After
Request 4: 180 // you use the previous value of 120 x 1.5 (sample value increment)
Request 5: ...
Response 5: Success!
Request 6: 1 second (assume default waiting interval per success response)
Response 6: Error without Retry-After included
Request 7: Wait 2 seconds (using the default)

还有一些行为不需要精确的间隔,有些行为会随机增加一个值。

您应该看看以下内容: