Когда внешний сервис не отвечает, интеграция должна делать четыре вещи в строгом порядке: не заблокировать ваш собственный процесс, сохранить неотправленное, перестать добивать упавшего и включить заранее описанный ручной обход. Если хотя бы одна из четырёх линий не заложена в проект, час чужого простоя превращается в ваши потерянные заказы и вечер разбора руками.
Важно принять исходную мысль: отказ поставщика — не аварийная ситуация, а нормальный режим работы, заранее посчитанный в его собственных обещаниях. Доступность 99,9 % означает право быть недоступным 8,8 часа в год, доступность 99,5 % — уже 43,8 часа. Эти часы не выбирают удобное время: они приходятся на рабочие дни ровно в той же пропорции, что и всё остальное.
Разбираем на модельном примере: интернет-магазин, оформление заказа зависит от внешнего сервиса расчёта стоимости доставки. В пиковый час через оформление проходит 12 заказов, средний чек 3 800 ₽, маржа 22 % — то есть 836 ₽ с заказа. Дальше считаем, во что обходится час без плана и час с планом.
Четыре линии поведения при отказе
Линии не заменяют друг друга, а накладываются. Буфер спасает то, что можно доставить позже. Повторы закрывают короткие сбои. Режим пониженной функциональности позволяет продолжать работу без внешнего сервиса вообще. Ручной обход нужен там, где всё предыдущее не сработало, и он же — самая дешёвая строка, которую пропускают чаще всего.
| Линия | Что делает | Где применима | Цена в смете |
|---|---|---|---|
| Буфер и отложенная отправка | Событие складывается в очередь и уходит, когда получатель ответит | Всё, что можно доставить позже: заказ в учёт, документ, уведомление | 54 000 ₽ |
| Повтор с нарастающей паузой | Повторяет отправку через 5 секунд, 1, 5 и 15 минут, 1 и 4 часа | Короткие сбои от минут до нескольких часов | 46 000 ₽ вместе с ключом операции |
| Режим пониженной функциональности | Процесс идёт без внешнего сервиса на резервных данных: фиксированный тариф, вчерашний остаток, ручное подтверждение | То, что нельзя остановить: оформление заказа, касса, запись клиента | 38 000 ₽ |
| Ручной обходной путь | Люди выполняют операцию по регламенту, данные догоняют после восстановления | Редкие и дорогие операции: платёж, бронь, срочная отгрузка | 12 000 ₽ на регламент и обучение |
Все четыре линии вместе — 150 000 ₽ в смете интеграции. Первые две строки подробно разобраны в материале про очередь и повторные попытки, поэтому здесь остановимся на двух последних: именно они отличают обмен, который переживает час простоя, от обмена, который его переживает вместе с вашими менеджерами.
Схема потоков данных. Слева блок «Событие в вашей системе», от него стрелка к развилке «Внешний сервис отвечает?». Ветка «Да» ведёт в «Готово». Ветка «Нет» расходится на четыре подписанные дорожки, идущие сверху вниз: «1. Буфер — событие в очереди, 54 000 ₽»; «2. Повтор — 5 с, 1 мин, 5 мин, 15 мин, 1 ч, 4 ч, 46 000 ₽»; «3. Режим пониженной функциональности — резервный тариф из справочника, 38 000 ₽»; «4. Ручной обход — регламент на час, 12 000 ₽». Все четыре дорожки сходятся в правый блок «Процесс продолжается» и далее в блок «Догон данных после восстановления». Внизу подпись: «Итого 150 000 ₽ в смете». Чертёжный стиль, подписи по-русски.
Таймаут: почему долгое ожидание опаснее быстрого отказа
Время, после которого ваша система перестаёт ждать ответа и считает попытку неудачной. Это не техническая мелочь, а решение о том, чей простой видит ваш клиент: чужой или ваш.
Отсутствие таймаута или таймаут в 30 секунд на странице оформления заказа означает, что покупатель тридцать секунд смотрит на крутящийся индикатор. Для него это не «поставщик доставки недоступен», а «магазин сломался», и уходит он не к поставщику, а от вас. Быстрый честный отказ на третьей секунде с подстановкой резервного тарифа покупатель, как правило, вообще не замечает.
- Синхронный вызов в момент действия клиента — 3 секунды. Расчёт доставки, проверка промокода, показ остатка. Дальше — резервное значение и пометка «уточним при подтверждении».
- Фоновая операция без ожидающего человека — 30 секунд. Передача заказа в учёт, отправка документа, обновление статуса. Здесь ожидание никому не мешает, потому что за ним стоит очередь.
- Ночная выгрузка большого объёма — до 5 минут на пакет. Тут длинный таймаут оправдан: собеседник действительно долго собирает ответ, и обрыв означает повтор всей работы.
Если ваш сайт при каждом оформлении синхронно ждёт чужого ответа по 30 секунд, то в пиковый час все свободные обработчики заняты ожиданием — и сайт перестаёт отвечать целиком, включая страницы, к внешнему сервису отношения не имеющие. Со стороны это выглядит как падение вашего сайта, и разбираться в причинах будете вы. Ограничение времени ожидания и вынос вызова в фон — не оптимизация, а защита от чужой аварии.
Предохранитель: перестать добивать упавший сервис
Когда сервис лёг, обмен обычно начинает повторять запросы чаще: очередь копится, каждая новая операция тоже пробует пройти. Получается, что на поставщика в момент его аварии приходит нагрузка больше обычной. Лечится это предохранителем — простым правилом, которое размыкает цепь и даёт паузу.
Правило вида «после 5 отказов подряд перестать обращаться к сервису на 2 минуты, затем пропустить одну пробную операцию: прошла — работаем дальше, не прошла — снова пауза». Всё это время события копятся в очереди и не теряются.
У предохранителя есть вторая, менее очевидная польза. Многие поставщики — маркетплейсы, платёжные и логистические сервисы — при потоке обращений во время ограничения продлевают окно ограничения для вашего ключа. То есть настойчивость буквально удлиняет ваш простой. Как устроены такие ограничения и по каким правилам они снимаются, разбираем отдельно в материале про лимиты API и превышение.
Что нельзя откладывать ни при каких условиях
Буфер и повтор безопасны для большинства операций, но есть три, где автоматический повтор создаёт ущерб больше, чем сам сбой. Для них правило другое: не повторять, а сначала спросить, не сделано ли уже, и в любом случае сказать человеку правду.
- 1Платёж. Деньги либо списаны, либо нет, и повтор вслепую создаёт второе списание. Правильное поведение — запросить статус операции по её номеру и только потом решать. Если статус получить нельзя, платёж уходит в карантин и разбирается человеком.
- 2Бронь ограниченного ресурса. Слот записи, последний товар на складе, окно доставки. Повтор создаёт вторую бронь на то же место, и разбирать её будет администратор при живом клиенте. Здесь нужен ключ операции — тот же механизм, что защищает от задвоенных заказов.
- 3Ответ клиенту. Человек ждёт сейчас, и тишина для него хуже отказа. Если подтверждение записи не ушло, клиенту отправляется честное «заявка принята, подтвердим в течение часа», а задача ставится на менеджера. Молчание в этот час стоит дороже любой технической ошибки.
Сколько стоит один час без плана и с планом
Возвращаемся к модельному магазину: 12 заказов в пиковый час, средний чек 3 800 ₽, маржа 22 %, то есть 836 ₽ с заказа. Сервис расчёта доставки недоступен ровно час. Сравниваем два поведения: система показывает ошибку и оформление прерывается — или система подставляет резервный тариф из собственного справочника и принимает заказ.
Теперь годовая арифметика. Поставщик с обещанной доступностью 99,9 % имеет право быть недоступным 8,8 часа в год. При разнице 6 265 ₽ за час это 55 132 ₽ в год, то есть около 4 594 ₽ в месяц. Режим пониженной функциональности стоил в смете 38 000 ₽ разово — он окупается на девятом месяце и дальше работает бесплатно. Если же поставщик обещает 99,5 %, то есть 43,8 часа в год, окупаемость сокращается примерно до двух месяцев.
Два столбца в рублях. Левый «Без плана — 7 155 ₽» разбит на два сегмента: «8 потерянных заказов × 836 ₽ = 6 688 ₽» и «звонки клиентов 467 ₽». Правый «С планом — 890 ₽» разбит на «расхождение тарифа 540 ₽» и «сверка после восстановления 350 ₽». Между столбцами вертикальная выноска «разница 6 265 ₽ за час». Под диаграммой строка: «8,8 часа в год при доступности 99,9 % = 55 132 ₽». Ось подписана в рублях.
План на час простоя: что делают люди
Техническая часть закрывает поток данных, но не закрывает работу компании. План на час простоя — это половина страницы текста, которая лежит у ответственного и содержит пять шагов с конкретными именами. Без него даже безупречно спроектированный обмен даёт картину «система что-то сама делает, а сотрудники не знают, отгружать или ждать».
- 10–2 минуты: обнаружение
Простой замечает не клиент и не бухгалтер, а датчик. Порог — обычно 30 минут молчания обмена, для критичных сервисов меньше. Какие сигналы ставить и на что их настраивать, разобрано в материале про мониторинг интеграций.
- 22–5 минут: оповещение
Сообщение уходит конкретному человеку в компании и дежурному подрядчика, а не «на общую почту». В плане записано имя, должность и запасной контакт. Если человек в отпуске, указан второй.
- 35–15 минут: переключение в резервный режим
Названо, кто вправе включить режим пониженной функциональности, и по какому признаку. Обычно это одно действие в админке и одно сообщение в рабочий чат: «доставка считается по резервному тарифу, подтверждайте заказы как обычно».
- 4Весь простой: работа руками по регламенту
Полстраницы для менеджеров и склада: что делать можно, что нельзя, где брать данные. Ключевая строка — что записывать, чтобы потом сверить: обычно достаточно списка номеров заказов, обработанных вручную.
- 5После восстановления: догон и сверка
Очередь выпускается с ограничением скорости, чтобы не уронить поднявшийся сервис повторно. Затем сверяются числа за период простоя и разбирается карантин. Записи о том, что происходило, остаются в журнале обменов и служат материалом для разговора с поставщиком.
Горизонтальная лента времени длиной в один час с пятью отметками: «0–2 мин — датчик заметил молчание обмена», «2–5 мин — оповещение ответственному и дежурному подрядчика», «5–15 мин — включён режим резервного тарифа», «15–60 мин — менеджеры работают по регламенту, номера заказов записываются», «после восстановления — выпуск очереди с ограничением скорости и сверка». Под лентой две параллельные дорожки: верхняя «Что делает система», нижняя «Что делают люди». Чертёжный стиль, подписи по-русски.
Когда всё это не нужно
Полный набор из четырёх линий оправдан не везде. Есть три ситуации, где достаточно одной очереди или вообще ничего, и платить за остальное смысла нет.
- Внешний сервис не в критическом пути. Отправка отзыва в агрегатор, выгрузка статистики, синхронизация карточек по ночам. Здесь хватит буфера: доедет через час — ничего не изменится. Режим пониженной функциональности для таких задач — потраченные 38 000 ₽.
- Меньше 30 операций в день. При таком объёме дешевле написать регламент на бумаге и один раз обучить двух человек. Автоматический резервный режим окупится за годы, а регламент работает с первого дня и стоит 12 000 ₽.
- Резервных данных не существует. Курс валют или тариф доставки можно подставить из справочника, а результат банковского скоринга или ответ государственной системы подставить нечем. В этих случаях честнее остановить процесс и сказать клиенту, что решение будет позже, чем выдумывать значение и потом его отзывать.
И отдельная честная оговорка про деньги: сама по себе устойчивость к чужим сбоям не приносит выручки и не видна на демонстрации. Она проявляется только в те 8,8 часа в год, когда поставщик молчит. Поэтому решение принимается арифметикой: если ваш час простоя стоит меньше тысячи рублей, обходитесь очередью и регламентом. Если больше пяти тысяч — считайте по формуле выше и закладывайте резервный режим в смету сразу, а не после первого инцидента.
