🔴 Сложный · 3 очк. Паттерны проектирования
Для чего нужен паттерн singleflight и как он реализован в Go?
A При множестве одновременных запросов с одним ключом выполняется только один реальный вызов
B Один запрос на один сервер в кластере
C Один полет горутины на канал
D Паттерн для одиночного выполнения функции при старте приложения
Объяснение вопроса

Singleflight решает проблему thundering herd: при промахе кеша все горутины идут за данными одновременно. Пакет golang.org/x/sync/singleflight гарантирует, что для одного ключа выполняется одна функция, остальные ждут.

var group singleflight.Group
func getData(key string) (string, error) {
    v, err, _ := group.Do(key, func() (interface{}, error) {
        return fetchFromBackend(key)
    })
    if err != nil { return "", err }
    return v.(string), nil
}

Третий возвращаемый параметр shared (bool) показывает, получил ли вызывающий результат от чужого вызова.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.