Паттерн circuit breaker для сторонних API в визуальных рабочих процессах
Узнайте паттерн circuit breaker для сторонних API в визуальных рабочих процессах: задавайте пороги, перенаправляйте на откаты, блокируйте агрессивные повторы и отправляйте понятные оповещения.

Почему сбои сторонних API ломают больше, чем одну функцию
Один и тот же сторонний API часто стоит в центре повседневных задач: обработка платежей, проверка адресов, синхронизация запасов, отправка сообщений, верификация личности. Когда у поставщика проблемы, редко страдает только одна кнопка. Он может заморозить целые потоки, которым нужен этот ответ, чтобы продолжить.
Вот почему circuit breaker важен. Это не теория — это практический способ сохранить работу ключевых процессов даже при нездоровой интеграции.
Медленная работа и полный отказ вредят по-разному.
Когда API медленный, ваш рабочий процесс всё ещё пытается выполнить запрос, но каждый шаг ждёт. Пользователи видят крутящиеся индикаторы, служба поддержки получает тикеты «всё зависло», а фоновые задания накапливаются. Медленность коварна, потому что может выглядеть как сбой вашей собственной системы.
Когда API не отвечает, вы получаете тайм-ауты или жёсткие ошибки. Это понятнее, но часто опаснее, потому что рабочие процессы склонны к повторным попыткам. Когда много запросов повторяются одновременно, вы создаёте шторм трафика, который усложняет восстановление и может повлечь за собой падение вашей системы.
Типичные симптомы проявляются быстро: тайм-ауты, растущие очереди, частичные обновления и много ручной очистки.
Реальный ущерб — это цепная реакция. Если поставщик тарифов доставки медлит, размещение заказа замедляется, потому что рабочий процесс отказывается подтвердить заказ без расчёта. Если платежи не работают, служба поддержки может не иметь возможности оформить возвраты, даже если всё остальное в порядке.
Нельзя притворяться, что сбоев нет. Цель — спроектировать рабочие процессы с понятными путями отката, правилами временной блокировки и оповещением, чтобы бизнес мог продолжать принимать заказы, обслуживать клиентов и фиксировать работу, пока интеграция восстанавливается.
Circuit breaker простыми словами
Circuit breaker — это выключатель безопасности для вызовов API. Когда сторонний сервис начинает падать, выключатель предотвращает постоянные обращения к нему. Вместо того чтобы один сбой превратить в медленные экраны, тайм-ауты и застрявшие задания, вы контролируете радиус поражения.
У circuit breaker три простых исхода:
- Разрешить вызов, когда поставщик выглядит здоровым.
- Блокировать вызов, когда число ошибок велико, и сразу перейти к откату.
- Попробовать ограниченный тестовый вызов после короткой паузы, чтобы проверить, вернулся ли поставщик.
Если предпочитаете термины, это «closed», «open» и «half-open». Названия не главное — важна предсказуемость. Когда поставщик болеет, ваш workflow должен вести себя одинаково каждый раз.
Это не скрывает ошибки. Вы всё равно фиксируете сбои, показываете понятный статус пользователям или операторам и оповещаете нужных людей. Вы сознательно выбираете быстро проваливаться, маршрутизировать работу на более безопасный путь или ненадолго приостановиться перед новой попыткой.
Выберите вызовы API, которые не должны останавливать бизнес
Circuit breaker лучше всего работает, когда вы избирательны. Не каждый вызов поставщика требует особой защиты. Начните со шагов, которые в случае блокировки останавливают деньги, заказы или доступ пользователей.
Практический метод — проследить один пользовательский запрос от начала до конца. Где тайм-аут заставит пользователя бросить задачу или создаст беспорядок, который вашей команде потом придётся убирать?
Типичные вызовы, которые «нельзя блокировать», включают платежи, доставку и выполнение заказов, вход/SSO/MFA, одноразовые пароли и подтверждающие сообщения, а также проверки на соответствие, привязанные к утверждению.
Разделяйте шаги, видимые пользователю, и фоновые задания. Если кто-то ждёт на экране оформления заказа, нужен быстрый ответ: успех, откат или стоп с понятным сообщением. Для фоновой работы, например синхронизации трекинг-номеров, более медленные повторы приемлемы, пока они не блокируют основной поток.
Начните с малого, чтобы избежать разрастания области. Сначала защитите 1–3 workflow, потом расширяйте.
Определите, что значит «безопасный откат», до того как строить. Хорошие откаты специфичны и тестируемы:
- Платежи: сохранить заказ как «payment pending», чтобы корзина не потерялась.
- Доставка: использовать кэшированный тариф, фиксированную ставку или подтвердить заказ и отложить покупку этикетки.
- Идентификация: разрешить вход по паролю, если SSO недоступно, или переключиться на проверку по email.
- Сообщения: поставить SMS в очередь и предоставить альтернативный путь, если возможно.
В AppMaster в Business Process Editor это часто становится компактной веткой: основная операция продолжается, а зависимый от поставщика шаг переходит на контролируемую альтернативу.
Состояния, пороги и таймеры, которые можно объяснить
Circuit breaker — это переключатель безопасности. Большую часть времени он пропускает вызовы. Когда поставщик начинает падать, он срабатывает, чтобы защитить рабочий процесс от потери времени и накопления ошибок.
Три состояния
Closed — нормальное состояние. Вы вызываете API и продолжаете.
Если ошибки пересекают порог, выключатель переходит в Open. Вы перестаёте обращаться к поставщику на короткий период и сразу же переходите к откату (кэшированное значение, отложенная работа, альтернативный поток).
После времени охлаждения выключатель переходит в Half-open. Вы разрешаете небольшое количество тестовых вызовов. Если они успешны — возвращаетесь в Closed. Если нет — снова Open.
Что измерять
Используйте сигналы, соответствующие тому, как падает поставщик:
- Тайм-ауты
- HTTP 5xx
- Растущая задержка (слишком медленно, чтобы быть полезным)
- Ошибки соединения/DNS
- 429 — превышение лимита запросов
В визуальном инструменте рабочого процесса это обычно сводится к простым проверкам: код состояния, прошедшее время и конкретные ошибки в выводе.
Стартовые пороги и два ключевых таймера
Начните с чисел, которые легко объяснить, затем настраивайте по реальному трафику. Примеры:
- Открывать breaker, если 5–10 вызовов неудачны в течение 30–60 секунд.
- Или открывать, если 20%–40% вызовов неудачны в скользящем окне.
- Считать задержку ошибкой, если она превышает то, что процесс может терпеть (часто 2–5 секунд).
Потом настройте два таймера:
- Время охлаждения (Open): обычно 30 секунд — 5 минут.
- Окно тестирования (Half-open): разрешить 1–5 тестовых вызовов или короткое окно, например 10–30 секунд.
Цель проста: быстро проваливаться, когда поставщик нездоров, и автоматически восстанавливаться, когда он вернулся.
Пошагово: как построить circuit breaker в визуальном workflow
Самое важное проектное решение — принять «вызывать ли поставщика сейчас?» в одном месте, а не раскидывать по всем workflow.
1) Поместите вызов поставщика за одним переиспользуемым блоком
Создайте подпроцесс (переиспользуемый блок workflow), который будут использовать все процессы, когда им нужен этот поставщик. В AppMaster это естественно отображается как Business Process, который можно вызывать из endpoints или автоматизаций. Держите его узким: входные данные, вызов поставщика и понятный результат успеха/ошибки.
2) Отслеживайте ошибки по времени, а не только по количеству
Фиксируйте каждое событие с отметкой времени. Храните такие поля, как последнее успешное выполнение, последнее падение, число падений в окне, текущее состояние и дедлайн охлаждения.
Сохраняйте эти поля в таблице, чтобы breaker переживал рестарты и был согласован между экземплярами. PostgreSQL через Data Designer для этого подходит.
3) Определите правила смены состояния и соблюдайте их везде
Держите правила простыми. Пример: если 5 ошибок произошли в течение 2 минут, переключить в Open. Пока выключатель в Open — пропускать вызов поставщика до окончания cooldown. После cooldown — переход в Half-open и разрешение одной контролируемой попытки. Успех — закрыть breaker, неудача — снова открыть.
4) Разветвляйте workflow: путь поставщика vs путь отката
Перед вызовом поставщика проверяйте сохранённое состояние:
- Closed: вызвать поставщика и обновить успех или ошибку.
- Open: пропустить вызов и выполнить откат.
- Half-open: разрешить ограниченную попытку и решить, закрывать или снова открывать.
Например: если API печати этикеток доставки не работает, откат может создать заказ со статусом «Label pending» и поставить задачу на повторную попытку, вместо блокировки оформления заказа или работы склада.
5) Сделайте его общим для всех workflow
Если у вас несколько workflow и серверов, они должны читать и записывать одно и то же состояние breaker. Иначе один экземпляр может продолжать «бомбить» поставщика, в то время как другой уже решил приостановиться.
Откатные пути, которые позволяют работе продолжаться
Circuit breaker поможет только если вы заранее решите, что делать, когда вызов заблокирован. Хороший откат позволяет пользователю продолжать работу, защищает данные и делает последующую очистку предсказуемой.
Выберите откат, соответствующий задаче. Если провайдер тарифов доставки недоступен, вам может не понадобиться точная цена, чтобы принять заказ. В визуальном workflow направьте неудачный шаг к ветке отката, которая даст полезный результат.
На практике откаты обычно выглядят так:
- Использовать кэшированное последнее известное значение (с явным сроком годности).
- Применить безопасную оценку/фиксированную ставку с пометкой.
- Направить на ручную проверку.
- Поставить работу в очередь для повторной обработки (асинхронно).
Пользовательский опыт важен не меньше логики. Не показывайте расплывчатую ошибку. Объясните, что случилось и что можно сделать дальше: «Мы не смогли подтвердить тариф сейчас. Вы можете оформить заказ с ориентировочной стоимостью доставки или сохранить его для проверки.»
Также планируйте кратковременные и длительные простои. Короткий сбой (минуты) часто означает «продолжаем и повторяем в фоне». Длительный (часы) может требовать более строгого поведения, например ручной проверки или одобрений.
Наконец, отслеживайте каждый откат, чтобы сверка была простой. Минимум — сохраняйте тип отката, исходные данные запроса, что вернули пользователю (и была ли это оценка) и статус для последующего действия.
Временные блокировки и более умные повторы
Неконтролируемые повторы превращают небольшие просадки у поставщика в реальные простои. Когда многие workflow одновременно повторяют запросы, они создают всплеск (проблема «thundering herd»). Поставщик замедляется, ваши очереди растут, и вы расходуете лимиты.
Повторы должны быть предсказуемыми и ограниченными и должны учитывать состояние breaker. Практическая политика:
- Ограничьте число повторов (часто 2–3).
- Используйте экспоненциальный бэк-офф (например, 2с, 8с, 30с).
- Добавьте джиттер, чтобы запросы не синхронизировались.
- Ограничьте общее время повтора (например, 60–90 секунд).
- Если breaker в Open — не повторять, а сразу идти в откат.
Временные блокировки связаны, но отличаются. Они нужны, когда ответ явно говорит «это сейчас не сработает». Общие правила:
- 429 rate limit: блокировать на период, указанный в Retry-After (или на безопасный фиксированный интервал).
- 401/403 автентификация: блокировать до обновления учётных данных, затем выполнить одну проверочную попытку.
- Постоянные 5xx: блокировать ненадолго, затем разрешить маленькую тестовую попытку.
Во время блокировки решите, что делать с работой уже в процессе: поставить в очередь, перенаправить или деградировать поведение (например, принять заказ, но отложить отправку SMS).
Оповещения, которые подсказывают, что делать
Circuit breaker полезен только если о нём вовремя узнают и понимают, что делать. Цель — не шум, а одно понятное сообщение, когда поведение меняется: вызовы блокируются, откаты активны или breaker остаётся открытым дольше ожидаемого.
Хорошие триггеры по умолчанию:
- Оповещение при открытии breaker.
- Оповещение, если он остаётся открытым дольше установленного лимита.
- Оповещение при резком росте ошибок ещё до открытия.
Делайте оповещения действенными. Указывайте поставщика и endpoint, текущее состояние и когда оно изменилось, что почувствуют пользователи, что сейчас делает workflow (блокирует, повторяет, использует откат) и одно рекомендованное следующее действие.
Маршрутизируйте оповещения по степени важности. Некритичные API обогащения могут отправляться на email. Платежи, вход или оформление заказа обычно требуют paging. В AppMaster это удобно настраивается ветками, которые отправляют email, Telegram или SMS в зависимости от флага серьёзности.
Отслеживайте небольшой набор метрик, чтобы видеть восстановление: достаточно числа заблокированных вызовов и использования откатов по поставщику.
Пример: сбой поставщика без остановки заказов
Распространённый сценарий: провайдер тарифов доставки падает прямо во время оформления заказа. Если ваш workflow настаивает на живом расчёте тарифов при создании заказа, один сбой может остановить все заказы.
В обычный день заказ создаётся, затем workflow запрашивает живые тарифы и сохраняет заказ с выбранным перевозчиком и ценой.
Когда поставщик начинает падать, вызовы тайм-аутятся или возвращают 5xx. Когда достигается порог (например, 5 ошибок за 2 минуты), breaker открывается.
Пока Open, workflow перестаёт вызывать поставщика на короткое окно (скажем, 10 минут). Это предотвращает падение оформления заказов для всех из‑за проблем у одного поставщика.
Вместо блокировки оформления, откат может:
- Применить фиксированную ставку (или безопасную оценку).
- Создать заказ в любом случае.
- Отметить его как “Shipping rate pending” для последующего пересчёта.
- Сохранить детали ошибки поставщика для последующей проверки.
В AppMaster это чёткая ветка в Business Process Editor, поддержанная полями Data Designer, такими как shipping_rate_status и shipping_rate_source.
Быстрая проверка перед запуском
Circuit breaker должен вести себя одинаково под нагрузкой и в демонстрации. Перед релизом проверьте базовые вещи:
- Пороги и времена охлаждения задокументированы и легко меняются.
- Состояние Open блокирует вызовы немедленно (без ожидания тайм-аутов поставщика).
- Поведение отката безопасно с точки зрения денег и обещаний клиентам.
- Пробирование в Half-open ограничено несколькими тестовыми вызовами.
- Логи дают возможность быстро понять время и масштаб влияния.
Потратьте дополнительное время на безопасность откатов. Откат, «позволяющий продолжать работу», может нести финансовый риск. Если платежный провайдер не работает, отмечать заказы как оплаченные опасно. Безопаснее — «payment pending» с понятной коммуникацией клиенту.
Тестируйте восстановление целенаправленно. Принудите ошибки, посмотрите, как breaker открывается, дождитесь cooldown и убедитесь, что Half-open отправляет только маленькую пробную попытку. Если она успешна — breaker быстро закрывается. Если нет — снова открывается без «наезда» на поставщика.
Ваши логи должны отвечать за минуту: кто пострадал, когда началось, какой шаг workflow сработал как триггер и какой откат использовался.
Следующие шаги: реализуйте паттерн в AppMaster
Выберите одну интеграцию, которая может повредить ежедневной работе при сбое (платежи, печать этикеток, SMS, синхронизация CRM). Постройте breaker от конца до конца для этого вызова первым. Когда команда доверится поведению, используй ту же шаблонную реализацию для следующего поставщика.
В AppMaster моделируйте состояние breaker в PostgreSQL через Data Designer. Держите всё просто: запись на поставщика (или endpoint) с полями state, failure_count, last_failure_at, open_until и коротким last_error.
Реализуйте логику в Business Process Editor понятными ветвями. Ясность важнее хитрости.
Практический порядок сборки:
- Проверить состояние breaker и блокировать вызовы, когда
open_untilв будущем. - Вызвать API поставщика и зафиксировать как успех, так и ошибку.
- При успехе сбросить счётчики и закрыть breaker.
- При ошибке увеличить счётчики и открыть breaker при достижении порогов.
- Маршрутизировать пользовательские потоки в откат (поставить в очередь работу, использовать кэш или переключиться на ручную обработку).
Задокументируйте решение об откате простым языком, чтобы поддержка и операции знали, что видит пользователь.
Когда breaker открывается, уведомьте ответственного через модули сообщений AppMaster (email, SMS, Telegram). Включите главное: поставщик, endpoint, состояние и первое рекомендованное действие.
Если вы строите эти рабочие процессы в AppMaster, appmaster.io — практичное место для старта, потому что один и тот же визуальный Business Process может обеспечивать endpoints, фоновые задания и оповещения с одним общим состоянием breaker.
Вопросы и ответы
A circuit breaker stops repeated calls to a failing vendor and forces a fast, predictable outcome. Instead of waiting on timeouts and piling up retries, you either proceed normally, take a fallback path immediately, or allow a small test call after a cooldown.
It’s worth it when a vendor call can block money, orders, or customer access, or when failures create a queue that’s hard to clean up. Start with 1–3 high-impact workflows like checkout payments, shipping rates/labels, login/SSO, or OTP delivery.
“Slow” makes your system look broken because users wait, pages spin, and jobs back up even if the vendor eventually responds. “Down” is clearer but can be worse because many systems retry aggressively, causing a traffic storm that delays recovery and can overload your own infrastructure.
Closed means calls are allowed as normal. Open means calls are blocked for a short period and your workflow immediately uses a fallback. Half-open means you allow a small number of test calls after cooldown to check if the vendor is healthy again.
Use signals that match real failure: timeouts, HTTP 5xx, connection/DNS errors, rate limits (429), and latency that exceeds what your workflow can tolerate. Treat “too slow to be useful” as a failure so you fail fast instead of making users wait.
Start with simple rules you can explain, then tune from traffic. A common setup is opening after 5–10 failures in 30–60 seconds, or when 20%–40% of calls fail in a rolling window, with latency over 2–5 seconds counted as failure for user-facing steps.
A safe default is 30 seconds to 5 minutes for the Open cooldown, so you stop hammering the vendor while it’s unhealthy. In Half-open, allow only 1–5 test calls (or a brief window like 10–30 seconds) so you can recover quickly without flooding the vendor.
Pick a fallback that keeps work moving without lying about the outcome. Examples include saving an order as “payment pending,” using a cached or flat shipping rate with clear labeling, queueing messages for later, or routing the case to manual review.
Keep retries low (often 2–3), use exponential backoff, add jitter, and cap total retry time so you don’t clog queues. If the breaker is Open, don’t retry at all; go straight to fallback so you avoid creating a thundering herd.
Alert when the breaker opens, when it stays open too long, and when errors spike even before it opens. Each alert should say which vendor/endpoint is affected, what users will see, what fallback is active, when the state changed, and the next action your team should take.


