public long backoff(long attempts) {
        if (expMax == 0) {
            return initialInterval;
        }
        double exp = Math.min(attempts, this.expMax);
        double term = initialInterval * Math.pow(multiplier, exp);
        double randomFactor = jitter < Double.MIN_NORMAL ? 1.0 :
            ThreadLocalRandom.current().nextDouble(1 - jitter, 1 + jitter);
        long backoffValue = (long) (randomFactor * term);
        return Math.min(backoffValue, maxInterval);
    }
A utility class for keeping the parameters and providing the value of exponential
retry backoff, exponential reconnect backoff, exponential timeout, etc.
<p>
The formula is:
<pre>Backoff(attempts) = random(1 - jitter, 1 + jitter) * initialInterval * multiplier ^ attempts</pre>
If {$code maxInterval} is less that {@code initialInterval}, a constant backoff of
{@code maxInterval} will be provided. The jitter will never cause the backoff to exceed
{@code maxInterval}.
<p>
This class is thread-safe.
clients/src/main/java/org/apache/kafka/common/utils/ExponentialBackoff.java