Нагрузка превысила возможности сервиса. Какие приёмы позволяют деградировать управляемо, а не упасть целиком?
- Что делать при перегрузке сервиса?
- Что такое деградация функциональности?
Частичный отказ лучше полного: сбрасывать лишнюю нагрузку, отключать второстепенное, отдавать устаревшие данные.
- Сброс нагрузки — быстрый отказ части запросов, пока очереди не выросли
- Рубильники для рекомендаций, персонализации, аналитики — освобождают ресурсы главному
- Устаревшее из кэша лучше, чем ошибка
А ещё Увеличение таймаутов и очередей при перегрузке делает только хуже
Подробно
Ключевая мысль — частичный отказ лучше полного: система, обслуживающая семьдесят процентов запросов, полезнее лежащей целиком. Сброс нагрузки работает потому, что перегруженная система всё равно не выполнит всю работу, а попытка сделать это растягивает очереди и увеличивает задержку до бесполезных значений — быстрый отказ честнее. Отключение второстепенного (рекомендации, персонализация, аналитика) освобождает ресурсы для главного сценария; заранее заведённые рубильники делают это решением одного переключателя. Увеличение таймаутов — противоположный по смыслу шаг: оно удерживает потоки и соединения, ускоряя исчерпание ресурсов и превращая перегрузку в каскадный отказ. Полезно добавить и приоритизацию: платящий пользователь или критичный вызов должны иметь преимущество перед фоновой задачей.
Что хотят услышать
- Принцип частичного отказа.
- Конкретные приёмы: сброс нагрузки, отключение второстепенного, устаревшие данные.
- Почему большие таймауты и очереди вредны.
Частые ошибки
- Увеличивать таймауты при перегрузке.
- Отказываться от сброса нагрузки, пытаясь обслужить всех и не обслуживая никого.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Сбрасывать избыток: быстро отклонять часть запросов с 429
- ✓Отключать второстепенные функции, сохраняя ключевой сценарий
- ✗Увеличивать таймауты, чтобы дождаться ответа перегруженной зависимости и не терять запросы
- ✓Отдавать слегка устаревшие данные из кэша
Что спросят дальше
- Как выбрать, какие запросы отклонять первыми?
- Почему быстрый отказ полезнее долгого ожидания для вызывающего?
Разбор темы
- Надёжность и идемпотентность
Управляемая деградация вместо каскада, таймауты и бюджет времени запроса, безопасные ретраи и их мультипликация, идемпотентность как фундамент, предохранитель, отсеки и сброс нагрузки, transactional outbox вместо 2PC.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.