In a variety of computer networks, binary exponential backoff or truncated binary exponential backoff refers to an algorithm used to space out repeated retransmissions of the same block of data, often as part of network congestion avoidance.
Here is an implementation in Java
/** * Calculate Exponential backoff * * @param attempt * number that we are checking * @param maxDelayInSeconds * Max amount of time to wait * @param multiplier * How much of backoff to perform * @return */ public static long backoff(final int attempt, final long maxDelayInSeconds, final double multiplier) { final double delayInSec = (Math.pow(2.0, attempt) - 1.0) * .5; return Math.round(Math.min(delayInSec * multiplier, maxDelayInSeconds)); } |
Example
Here we have exponential backoff defined with three different parameters for the muliplier and 120 seconds as the max time.
System.out.println(String.format("Attempt\t\t 1\t4\t8\n")); for (int i = 0; i < 10; i++) { final long b1 = backoff(i, 120, 1); final long b2 = backoff(i, 120, 4); final long b3 = backoff(i, 120, 8); System.out.println(String.format("%d\t\t %d\t%d\t%d", i, b1, b2, b3)); } |
1 4 8 0 0 0 0 1 1 2 4 2 2 6 12 3 4 14 28 4 8 30 60 5 16 62 120 6 32 120 120 7 64 120 120 8 120 120 120 9 120 120 120
From the results above we can see that changing the multiplier can have significant implications. The larger the multiplier
the faster we will be approaching our maxDelay
and we will have longer paused between each attempt.
In next post, we will create a Data Retrieval Service that will utilize Exponential backoff.