Получить доступ

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

MiddleУстойчивость и наблюдаемостьSpring Boot
Ещё спрашивают так:
  • Как выбирать таймауты в цепочке сервисов?
Коротко

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

  • Иначе нижний сервис работает над запросом, который верхний уже бросил
  • Отдельно таймаут соединения и чтения; в RestClient и WebClient — явно
  • Значение — от наблюдаемого p99.9 зависимости, а не «30 секунд»

А ещё Лучше передавать дедлайн вниз (gRPC deadline, заголовок)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

  • Почему таймаут обязателен.
  • Убывающий бюджет по цепочке.
  • Как выбирать значение.

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

  • Оставлять умолчания HTTP-клиента, где таймаута может не быть вовсе.
  • Складывать повторы поверх таймаута, не проверив общий бюджет.

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

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

Показать варианты и ответ
  • ✓Без таймаута зависший вызов удерживает поток и соединение бесконечно; таймаут должен укладываться в бюджет вызывающего с запасом на повторы
  • ✗Таймаут нужен только для ускорения ответа, на устойчивость он не влияет
  • ✗Таймаут должен быть больше, чем у вызывающего, чтобы успеть получить ответ
  • ✗Достаточно таймаута на уровне балансировщика, в коде он не нужен

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

  • Чем connect timeout отличается от read timeout?
  • Как таймауты связаны с bulkhead?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем