"""Backoff Helpers.""" from random import randint def get_backoff( base: int, cap: int, retry_attempt: int, ) -> int: """Calculate backoff for sleep function.""" return int(min(cap, base * 2**retry_attempt)) def get_backoff_with_full_jitter( base_seconds: int, cap_seconds: int, retry_attempt: int, ) -> float: """Calculate backoff with jitter (in seconds) for sleep function. Implement the AWS Full Jitter algorithm. See: https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ """ return ( randint( 0, get_backoff(base_seconds * 1000, cap_seconds * 1000, retry_attempt), ) / 1000 )