Повышение устойчивости сервиса с высоким трафиком

500 тыс. запросов в минуту — около 8,3 тыс. RPS. Кешируйте одно вычисленное значение до 10 секунд и объединяйте одновременные обновления.

Короткий ответ

Что ответить на собеседовании

500 тыс. запросов в минуту — около 8,3 тыс. RPS. Кешируйте одно вычисленное значение до 10 секунд и объединяйте одновременные обновления.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо разработать механизм защиты от перегрузки для сервиса, способного обрабатывать до 500 000 запросов в минуту, при этом возвращаемый результат должен оставаться актуальным в течение 10 секунд. Требуется предложить решение, которое позволит снизить нагрузку, избежать перегрузок и обеспечить быструю и стабильную выдачу свежих данных.

func getBtcCourseHandler(w http.ResponseWriter, r *http.Request) { 
    // Генерация случайного числа вместо реального курса BTC.
    _, err := fmt.Fprintf(w, "The simulated BTC course is: %.2f USD", getCourse())
    if err != nil {
        log.Print(err)
    }
}

func main() {
    http.HandleFunc("/getCourse", getBtcCourseHandler)

    fmt.Println("Server is running on port 8080...")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        fmt.Println("Server failed:", err)
    }
}

func getCourse() float64 {
    rand.Seed(time.Now().UnixNano())
    // volatility от 30000-80000
    btcCourse := rand.Float64()*50000 + 30000
    return btcCourse
}

Ответ

500 тыс. запросов в минуту — около 8,3 тыс. RPS. Кешируйте одно вычисленное значение до 10 секунд и объединяйте одновременные обновления.

Храните значение вместе с fetched_at/expires_at. На чтении возвращайте готовый снимок; только один работник обновляет его до истечения срока. Для нескольких экземпляров используйте координацию обновления или общий кеш. Если жёстко запрещены данные старше 10 секунд, после дедлайна нужен ограниченный fallback/503, а не бесконечное stale-значение.

Ограничьте параллелизм обращения к источнику, задайте таймауты и rate limit, измеряйте p95/p99 и возраст данных. HTTP-кешу передавайте оставшийся срок, не новые 10 секунд поверх уже постаревшего значения. Случайное число в примере — только симуляция, не реальный курс и не повод опрашивать внешний источник на каждый GET.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее