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

В цепочке из пяти сервисов у пользователей выросло время ответа. Как вы будете искать причину и что для этого должно быть построено заранее?

MiddleНаблюдаемость и SLO
Ещё спрашивают так:
  • Как искать причину роста задержки в микросервисах?
  • Зачем нужна распределённая трассировка?
Коротко

Метрики показывают, где и когда выросло; трейсы — в каком шаге ушло время; логи по trace_id — почему. Работает, только если корреляция построена заранее.

  • По метрикам: какой сервис, с какого момента, перцентили, насыщение (очереди, пулы)
  • По трейсам медленных запросов: какой спан длинный — свой код, база, внешний вызов, ожидание пула
  • По логам этого trace_id: ошибки, повторы, медленный запрос

А ещё Заранее: сквозной traceparent (W3C), OpenTelemetry, структурированные логи, tail-based семплирование

Подробно

1. Локализовать по метрикам. Смотрим p95/p99 по каждому сервису и эндпоинту: где выросло и с какого времени. Сопоставляем с событиями — выкатка, всплеск трафика, изменение конфигурации. Смотрим насыщение: длину очередей, занятость пулов соединений и потоков, паузы GC — они выдают причину раньше утилизации CPU.

2. Найти шаг по трейсам. Берём трейсы медленных запросов: видно, какой спан занял время — запрос в базу, внешний вызов, ожидание соединения из пула, повторы. Важно сравнить с трейсами нормальных запросов.

3. Объяснить по логам. По trace_id находим структурированные логи всех сервисов этого запроса: ошибки, таймауты, план медленного запроса.

Что должно быть построено заранее:

  • сквозной идентификатор трассы через все сервисы и брокеры — заголовок traceparent (W3C Trace Context), автоматическая инструментация OpenTelemetry;
  • структурированные логи (JSON) с trace_id и span_id;
  • метрики в виде гистограмм с разрезом по версии и экземпляру;
  • tail-based семплирование — решение о сохранении трейса после его завершения: медленные и ошибочные сохраняются всегда. При head-based (решение в начале, например 1%) редкие медленные запросы до вас не доедут;
  • связь метрик с трейсами (exemplars).

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

  • Последовательность: метрики → трейсы → логи.
  • Насыщение как ранний признак.
  • Что нужно заранее: сквозная корреляция, OpenTelemetry, структурированные логи.
  • Tail-based семплирование — плюс.

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

  • Начинать с чтения логов всех сервисов подряд.
  • Не иметь сквозного идентификатора и пытаться сопоставлять по времени.

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

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Читать логи всех пяти сервисов по времени
  • ✗Сразу добавить инстансы в каждый сервис цепочки
  • ✓Метрики — где и когда, трейсы — какой шаг, логи по trace_id — почему; корреляция заранее
  • ✗Профилировать по очереди каждый сервис под нагрузочным тестом, пока не найдётся самый медленный метод

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

  • Почему хвост усиливается при параллельных вызовах?
  • Что бы вы измеряли, чтобы предсказать эту проблему заранее?

Разбор темы

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

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

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

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

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