Search
Write a publication
Pull to refresh
1
0
Nikita Bondarev @blessyocean

User

Send message
func withRetry(fn func() error, maxRetries int, backoff time.Duration) error {
    for i := 0; i < maxRetries; i++ {
        if err := fn(); err == nil {
            return nil
        }
        
        if i < maxRetries-1 {
            select {
            case <-time.After(backoff * time.Duration(i+1)):
                // Exponential backoff
            }
        }
    }
    return fmt.Errorf("exceeded max retries")
}

Здесь ошибка в комментарии, т.к. реализован линейный backoff.
Экспоненциальный делей можно реализовать вот так:

delay := backoff * time.Duration(1 << i)

Первый принцип идиоматики Go — простота и читаемость. Идиоматичный Go-код должен быть простым и понятным, без лишних абстракций. 

...

Среди сторонних библиотек выделяются для веб- и HTTP-API — лёгкие и быстрые gin или fiber. 

Игорь, мне кажется, что в сообществе Go веб-фреймворк gin не долюбливают из-за как раз таки лишних абстракций, присущих популярным фреймворкам из других языков программирования. Сам же я его нередко встречаю в вакансиях, но ни разу не приходилось использовать в продакшене.
Точно ли является его использование идиоматически с точки зрения Go?

Ещё по данной теме есть отличная статья, в которй более подробно рассказано про exponential backoff и его недостатки:
https://habr.com/en/companies/yandex/articles/762678/

Information

Rating
11,646-th
Registered
Activity