An exponential backoff implementation as described in an AWS architecture post. Uses full jitter.
from expbackoff import Backoff
backoff = Backoff(base_seconds=0.5, max_seconds=120)
while True:
backoff.sleep() # Depending on previous failures, potentially delay before performing an action
success = do_a_thing() # Perform an action, record whether it succeeded
backoff.update(success) # Update the failure count
backoff = expbackoff.Backoff(...)
- Create a Backoff object. Arguments:
base_seconds
(required): Part of the backoff calculation, i.ebase_seconds * 2 ^ (failures - 1)
max_seconds
(required): Max seconds to delay, regardless of failure count.failures
(optional): Number of current failures. Useful if another service is handling your retries. Defaults to0
.random
(optional): Arandom
object. Defaults torandom.random
.
backoff.sleep()
: If failures have occurred, sleep forbackoff.get_seconds_with_jitter()
backoff.update(success)
: Update the failure count by passing a boolean representing success.backoff.get_seconds_with_jitter()
: The current backoff time in seconds, with jitter applied. Zero if there are no recorded failures. Read-only.backoff.get_raw_seconds()
: The current backoff time in seconds, without jitter applied. Zero if there are no recorded failures. Read-only.backoff.failures
: The current number of failures. Read-only.
Popular options are retrying and backoff. These both use a
decorator API so aren’t suitable for all uses - hence expbackoff
.