Почему случайный джиттер применяется к стратегиям отсрочки?
Вот пример кода, который я видел.
int expBackoff = (int) Math.pow(2, retryCount);
int maxJitter = (int) Math.ceil(expBackoff*0.2);
int finalBackoff = expBackoff + random.nextInt(maxJitter);
Мне было интересно, в чем преимущество использования случайного джиттера здесь?
2 ответа
Предположим, у вас есть несколько клиентов, которые отправляют сообщения, которые сталкиваются. Все они решают отступить. Если они используют один и тот же детерминистический алгоритм, чтобы решить, как долго ждать, они все попытаются в одно и то же время, что приведет к другому столкновению. Добавление случайного фактора разделяет повторные попытки.
Это сглаживает трафик на запрашиваемом ресурсе.
Если ваш запрос терпит неудачу в определенное время, есть большая вероятность, что другие запросы терпят неудачу почти в одно и то же время. Если все эти запросы следуют одной и той же детерминированной стратегии отсрочки (скажем, повторная попытка через 1, 2, 4, 8, 16... секунд), то все, кто потерпел неудачу в первый раз, будут повторять попытки практически в одно и то же время, и есть большая вероятность, что одновременных запросов будет больше, чем может обработать служба, что приведет к большему количеству сбоев. Один и тот же кластер одновременных запросов может повторяться многократно и, вероятно, многократно повторяться, даже если общий уровень нагрузки на службу за пределами этих пиков повторных попыток невелик.
Путем введения джиттера начальная группа неудачных запросов может быть сгруппирована в очень маленьком окне, скажем, 100 мс, но с каждым циклом повторения кластер запросов распространяется во все большее и большее временное окно, уменьшая размер всплеска в данном конкретном случае. время. Служба, вероятно, сможет обрабатывать запросы при распределении по достаточно большому окну.
Рандомизация позволяет избежать повторных попыток нескольких вызовов одновременно.
Дополнительную информацию об экспоненциальном откате и дрожании можно найти здесь: https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/