Проектирование отказоустойчивых приложений на AWS
Разработка приложений на AWS
Ricardo Sueiras
Principal Technologist
Построение отказоустойчивых систем
Временные сбои
Изучите основные виды сбоев:
Временные ошибки исчезают сами по себе — как правило, безопасно повторить запрос.
Таймауты
Изучите основные виды сбоев:
Временные ошибки исчезают сами по себе — как правило, безопасно повторить запрос.
Таймауты: внешний сервис слишком долго не отвечает.
Постоянные ошибки
Изучите основные виды сбоев:
Временные ошибки исчезают сами по себе — как правило, безопасно повторить запрос.
Таймауты: внешний сервис слишком долго не отвечает.
Постоянные ошибки: запрос принципиально некорректен, повтор не поможет.
Ограничения API
Изучите основные виды сбоев:
Временные ошибки исчезают сами по себе — как правило, безопасно повторить запрос.
Таймауты: внешний сервис слишком долго не отвечает.
Постоянные ошибки: запрос принципиально некорректен, повтор не поможет.
Ограничения частоты запросов API: слишком много запросов, ожидайте HTTP 429 Too Many Requests.
Стратегии повторных запросов
Сбои в распределённых системах часто носят временный характер.
Повторный запрос нередко завершается успешно.
Добавляйте логику повторов осторожно: бесконтрольные повторы могут усугубить ситуацию.
Экспоненциальная выдержка: увеличивайте задержку между повторами.
Джиттер: добавляйте случайность, чтобы избежать всплесков повторных запросов.
Ограничение числа повторов: предотвращает бесконечные циклы.
Встроенные возможности AWS SDK
AWS SDK автоматически управляют логикой повторных запросов.
Встроенный механизм повторов включает экспоненциальную выдержку и джиттер.
Неудачные или заблокированные запросы повторяются с нарастающими задержками.
Это сокращает объём кода обработки ошибок, который нужно писать вручную.
Управление логикой повторных запросов
Логика повторных запросов подходит не всегда.
Ошибки HTTP 4xx: сервер понял запрос, но отклонил его.
Неидемпотентные запросы: повтор может привести к дублированию или несогласованности действий.
Управление таймаутами
Бесконечные повторы могут усиливать проблемы под нагрузкой.
Сочетайте повторные запросы с таймаутами.
Таймаут задаёт максимальное время ожидания ответа.
Каждый вызов внешнего сервиса должен иметь таймаут.
Прерыватели цепи
Если сервис продолжает давать сбои, одних повторов недостаточно.
Продолжение отправки запросов может перегрузить неработающий сервис.
Паттерн «прерыватель цепи» временно останавливает запросы к нездоровой зависимости.
Замкнутое состояние: запросы проходят в штатном режиме.
Прерыватели цепи
Когда число сбоев превышает порог, цепь размыкается.
Последующие запросы блокируются.
Прерыватели цепи
После паузы цепь переходит в полуоткрытое состояние для проверки восстановления.
Сервис отвечает успешно — работа возобновляется в штатном режиме.
Сбои продолжаются — цепь остаётся разомкнутой.
Реализуйте прерыватели цепи на уровне приложения.
Очереди недоставленных сообщений
Сообщения, которые постоянно не обрабатываются, могут блокировать систему.
Выносите их из основного потока обработки.
Необработанные сообщения попадают в очередь недоставленных сообщений (Dead Letter Queue).
Это ключевой элемент построения отказоустойчивых приложений.
Однако учитывайте компромиссы.
Ограничения API AWS
Взаимодействие с сервисами AWS происходит через API.
Каждый сервис устанавливает собственные ограничения частоты запросов.
Превышение лимитов приводит к троттлингу (HTTP 429 Too Many Requests).
Проектируйте приложение так, чтобы оно корректно обрабатывало троттлинг.
Интеграция со сторонними сервисами
Сторонние сервисы вносят непредсказуемость.
Вы не контролируете их производительность и доступность.
Устанавливайте таймауты, чтобы избежать долгого ожидания.
Используйте повторные запросы с выдержкой при временных сбоях.
Изолируйте зависимости, чтобы ограничить зону влияния отказа.
Интеграция со сторонними сервисами
Рассмотрите переход от синхронного к асинхронному взаимодействию.
Система продолжит работу, даже если внешний сервис задерживает ответ.
Давайте потренируемся!
Разработка приложений на AWS
Preparing Video For Download...