Вопрос с собеседования · System design

Нагрузка превысила возможности сервиса. Какие приёмы позволяют деградировать управляемо, а не упасть целиком?

MiddleНадёжность и идемпотентность
Ещё спрашивают так:
  • Что делать при перегрузке сервиса?
  • Что такое деградация функциональности?
Коротко

Частичный отказ лучше полного: сбрасывать лишнюю нагрузку, отключать второстепенное, отдавать устаревшие данные.

  • Сброс нагрузки — быстрый отказ части запросов, пока очереди не выросли
  • Рубильники для рекомендаций, персонализации, аналитики — освобождают ресурсы главному
  • Устаревшее из кэша лучше, чем ошибка

А ещё Увеличение таймаутов и очередей при перегрузке делает только хуже

Подробно

Ключевая мысль — частичный отказ лучше полного: система, обслуживающая семьдесят процентов запросов, полезнее лежащей целиком. Сброс нагрузки работает потому, что перегруженная система всё равно не выполнит всю работу, а попытка сделать это растягивает очереди и увеличивает задержку до бесполезных значений — быстрый отказ честнее. Отключение второстепенного (рекомендации, персонализация, аналитика) освобождает ресурсы для главного сценария; заранее заведённые рубильники делают это решением одного переключателя. Увеличение таймаутов — противоположный по смыслу шаг: оно удерживает потоки и соединения, ускоряя исчерпание ресурсов и превращая перегрузку в каскадный отказ. Полезно добавить и приоритизацию: платящий пользователь или критичный вызов должны иметь преимущество перед фоновой задачей.

Что хотят услышать

  • Принцип частичного отказа.
  • Конкретные приёмы: сброс нагрузки, отключение второстепенного, устаревшие данные.
  • Почему большие таймауты и очереди вредны.

Частые ошибки

  • Увеличивать таймауты при перегрузке.
  • Отказываться от сброса нагрузки, пытаясь обслужить всех и не обслуживая никого.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Сбрасывать избыток: быстро отклонять часть запросов с 429
  • ✓Отключать второстепенные функции, сохраняя ключевой сценарий
  • ✗Увеличивать таймауты, чтобы дождаться ответа перегруженной зависимости и не терять запросы
  • ✓Отдавать слегка устаревшие данные из кэша

Что спросят дальше

  • Как выбрать, какие запросы отклонять первыми?
  • Почему быстрый отказ полезнее долгого ожидания для вызывающего?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования