Please see the example implementation in js here ably/ably-js#997
Incremental backoff and jitter was added to the features spec in ably/docs#1445
To implement this we need to change the retry behaviour for:
- When the client connection is in the
DISCONNECTED state
- When a
RealtimeChannel is in the SUSPENDED state
The new retry behaviour is specified in RTB1 of the features spec.
RTB1a
The backoff coefficient described in RTB1a can be calculated in javascript like so:
function getBackoffCoefficient(retryAttempt) {
return Math.min((retryAttempt + 2) / 3.0, 2.0);
}
RTB1b
The jitter coefficient described in RTB1b can be calculated in javascript like so:
function getJitterCoefficient() {
return 1 - Math.random() * 0.2;
}
RTB1
The overall retry time calculation should look like:
function getRetryTime(initialTimeout, retryAttempt) {
return initValue * getBackoffCoefficient(retryAttempt) * getJitterCoefficient();
}
The following code can be used to test it:
[1, 2, 3, 4, 5].forEach((n) => {
console.log(getRetryTime(initValue, n));
});
Which, with an initValue of 15 (seconds) should print something like:
13.917470451245713
18.415226855678757
20.444851032898747
26.650729887092275
27.803382948778786
Expression to calculate upper and lower bounds for generated values using getRetryTime
upper = min((retryCount + 2) / 3, 2) *initialTimeout
lower = 0.8 * upper
if x is a generated retryTimeout from getRetryTime, then
┆Issue is synchronized with this Jira Task by Unito
Please see the example implementation in js here ably/ably-js#997
Incremental backoff and jitter was added to the features spec in ably/docs#1445
To implement this we need to change the retry behaviour for:
DISCONNECTEDstateRealtimeChannelis in theSUSPENDEDstateThe new retry behaviour is specified in RTB1 of the features spec.
RTB1a
The backoff coefficient described in
RTB1acan be calculated in javascript like so:RTB1b
The jitter coefficient described in
RTB1bcan be calculated in javascript like so:RTB1
The overall retry time calculation should look like:
The following code can be used to test it:
Which, with an
initValueof 15 (seconds) should print something like:Expression to calculate upper and lower bounds for generated values using
getRetryTimeif x is a generated retryTimeout from
getRetryTime, then┆Issue is synchronized with this Jira Task by Unito