Если 1С недоступна 2 часа ночью, а портал должен работать 24/7 — что делать? Разбираем паттерн автоматического выключателя на примерах из B2B.
Суть паттерна
Три состояния. Закрыто — всё работает. Открыто — сервис недоступен, все запросы получают резервный ответ. Полуоткрыто — пробуем один запрос, если прошёл — возвращаемся в Закрыто.
Зачем в B2B
Сайт показывает остатки из 1С. 1С недоступна ночью — сайт отдаёт ошибки или нулевые остатки. С автоматическим выключателем: 3 ошибки подряд → система переключается на кэш последних данных и добавляет пометку «данные могут быть неактуальны». Пользователь продолжает работать.
Реализация на Node.js
Библиотека opossum. Настройки: timeout 5 секунд, errorThresholdPercentage 50, resetTimeout 30 секунд. Резервный ответ: данные из Redis-кэша, обновляемого при каждом успешном ответе 1С. Если кэш пуст (первый запуск) — структура с пустыми полями и флагом stale: true, интерфейс показывает предупреждение.
Заказы
Никогда не идут напрямую в 1С. Схема: заказ → очередь PostgreSQL → «Принят в обработку» → обработчики создают документ в 1С при восстановлении. Если 1С недоступна 2 часа — заказы догоняются за 10 секунд.
Мониторинг
Три уровня оповещений. Информационный: автоматический выключатель в Полуоткрытом состоянии — запись в журнал. Предупреждение: выключатель открыт больше 5 минут — оповещение в Telegram. Критичный: открыт больше 30 минут или очередь заказов > 100 — звонок дежурному.
Метрики реального проекта
Логистический B2B-портал. Время отклика при недоступности 1С: 40 мс (было — превышение времени ожидания в 5 секунд). Потерянные заказы за ночную обработку: 0 (было 3–5). Годовая доступность — на уровне договорного SLA, без инцидентов, приведших к простоям.
Чек-лист внедрения
- Определите критичные внешние зависимости.
- Для каждой — свой автоматический выключатель с индивидуальными порогами.
- Резервный ответ должен возвращать корректные данные (не undefined).
- Все изменения — через очередь, не через синхронный вызов.
- Мониторинг состояния выключателя обязателен.
- Chaos Monkey: принудительно гасите 1С в тестовой среде.
Выводы
Автоматический выключатель обязателен для систем с внешними зависимостями. В B2B это разница между «сайт упал» и «сайт работает с задержкой». При правильной реализации пользователь не замечает сбоя.