Короткий ответ
Нужно заранее классифицировать функциональность по критичности для основного бизнес-сценария (покупка товара) и спроектировать разный fallback для каждой зависимости: некритичные (рекомендации) просто скрываются, частично критичные (поиск) заменяются деградированной альтернативой (популярные товары/категории), а критичная (оплата) требует чёткого сообщения пользователю и, возможно, альтернативного способа оплаты, а не полного отказа всей страницы.
Как это работает подробнее
для каждой внешней зависимости определяют "что произойдёт с пользовательским сценарием, если эта зависимость недоступна" и проектируют конкретный fallback заранее — пустой блок, кэшированные данные, альтернативный путь, явное сообщение об ошибке — вместо того, чтобы допускать, чтобы ошибка одной зависимости валила всю страницу через необработанное исключение.
Пример / кейс
Ожидаемое поведение: при одновременном отказе всех трёх зависимостей пользователь всё равно видит страницу товара и может добавить его в корзину; на этапе оплаты получает понятное сообщение без потери данных корзины, а не белый экран или общую ошибку 500.
Пример кода
Приоритизация для /product страницы:
1. Карточка товара и кнопка "Купить" — критично, нет fallback, страница не должна зависеть от других сервисов.
2. Поиск — при отказе показываем последние просмотренные/популярные категории.
3. Рекомендации — при отказе блок просто не отображается.
4. Оплата — при отказе провайдера: явное сообщение "Платёж временно недоступен, корзина сохранена",
с таймаутом запроса к провайдеру не более 5 секунд.Что использовать на практике
- Практический подход. Приоритизация обычно такая — основной путь покупки (просмотр товара, добавление в корзину, оплата) должен быть изолирован от некритичных сервисов через таймауты и try/except с fallback; для платежей, где fallback невозможен (нельзя "притвориться", что оплата прошла), важно хотя бы корректно и быстро сообщить пользователю статус и предложить повторить позже или использовать другой способ оплаты, не теряя содержимое корзины.
Подводные камни
- Частые ошибки. Реализовывать fallback только для "очевидных" некритичных сервисов, но не закрывать таймаутами критичные внешние вызовы (платёжный провайдер), из-за чего зависший запрос к нему вешает весь поток обработки заказа; показывать пользователю общую ошибку 500 вместо понятного сообщения о временной недоступности конкретной функции; не тестировать деградацию комбинаций отказов (например, поиск и рекомендации недоступны одновременно).