Добавление политик повтора в ваше программное обеспечение - простой способ повысить отказоустойчивость. Это особенно полезно при выполнении HTTP-запросов или других действий, связанных с сетью.
Если сначала у вас ничего не получится, попробуйте, попробуйте еще раз. В коде go, который переводится как:
Функция retry
рекурсивно вызывает себя, отсчитывая количество попыток и каждый раз спит в два раза дольше (т. Е. Экспоненциальная отсрочка). Этот метод работает до тех пор, пока не возникнет ситуация, когда большое количество клиентов запускают свои циклы повтора примерно в одно и то же время. Это могло произойти, если сразу разорвалось много подключений. В этом случае повторные попытки будут синхронизированы друг с другом, создавая так называемую проблему грохочущего стада. Чтобы предотвратить это, мы можем добавить некоторую случайность, вставив следующие строки перед вызовом time.Sleep
:
jitter := time.Duration(rand.Int63n(int64(sleep)))
sleep = sleep + jitter/2
Улучшенная, нервная версия:
Есть два варианта остановки цикла повторных попыток до того, как будут сделаны все попытки:
- Возврат
nil
- Вернуть обернутую ошибку:
stop{err}
Выберите вариант №2, когда возникает ошибка, когда повторная попытка будет бесполезной. Учитывайте большинство 4XX
кодов состояния HTTP. Они указывают на то, что клиент сделал что-то не так, и последующие попытки без каких-либо изменений в запросе приведут к тому же ответу. В этом случае мы по-прежнему хотим вернуть ошибку, поэтому мы помещаем ошибку в тип stop
. Фактическая ошибка, возвращаемая функцией повтора, будет исходной ошибкой без оболочки. Это позволяет проводить более поздние проверки, такие как err == ErrUnauthorized
.
Взгляните на следующую реализацию для повторной попытки HTTP-запроса. Примечание. В этом случае необходимы только 2 дополнительные строки для добавления политики повтора к существующей функции DeleteThing
(строки 14 и 34).
В upgear мы нашли эту функцию настолько полезной, что включили ее вариант в наш комплект go на github.
Примечания
[1 июня 2017] Сообщение отредактировано для добавления примера джиттера
Первоначально опубликовано на upgear.io.