Добавление политик повтора в ваше программное обеспечение - простой способ повысить отказоустойчивость. Это особенно полезно при выполнении HTTP-запросов или других действий, связанных с сетью.

Если сначала у вас ничего не получится, попробуйте, попробуйте еще раз. В коде go, который переводится как:

Функция retry рекурсивно вызывает себя, отсчитывая количество попыток и каждый раз спит в два раза дольше (т. Е. Экспоненциальная отсрочка). Этот метод работает до тех пор, пока не возникнет ситуация, когда большое количество клиентов запускают свои циклы повтора примерно в одно и то же время. Это могло произойти, если сразу разорвалось много подключений. В этом случае повторные попытки будут синхронизированы друг с другом, создавая так называемую проблему грохочущего стада. Чтобы предотвратить это, мы можем добавить некоторую случайность, вставив следующие строки перед вызовом time.Sleep:

jitter := time.Duration(rand.Int63n(int64(sleep)))
sleep = sleep + jitter/2

Улучшенная, нервная версия:

Есть два варианта остановки цикла повторных попыток до того, как будут сделаны все попытки:

  1. Возврат nil
  2. Вернуть обернутую ошибку: stop{err}

Выберите вариант №2, когда возникает ошибка, когда повторная попытка будет бесполезной. Учитывайте большинство 4XX кодов состояния HTTP. Они указывают на то, что клиент сделал что-то не так, и последующие попытки без каких-либо изменений в запросе приведут к тому же ответу. В этом случае мы по-прежнему хотим вернуть ошибку, поэтому мы помещаем ошибку в тип stop. Фактическая ошибка, возвращаемая функцией повтора, будет исходной ошибкой без оболочки. Это позволяет проводить более поздние проверки, такие как err == ErrUnauthorized.

Взгляните на следующую реализацию для повторной попытки HTTP-запроса. Примечание. В этом случае необходимы только 2 дополнительные строки для добавления политики повтора к существующей функции DeleteThing (строки 14 и 34).

В upgear мы нашли эту функцию настолько полезной, что включили ее вариант в наш комплект go на github.

Примечания

[1 июня 2017] Сообщение отредактировано для добавления примера джиттера

Первоначально опубликовано на upgear.io.