Любой обмен рано или поздно падает: недоступен API, битые данные, таймаут. Вопрос не в том, случится ли сбой, а в том, восстановится ли связка автоматически. Разберём, как проектировать обработку ошибок и безопасную повторную синхронизацию на 1С-Битрикс.
Классификация ошибок обмена
Первый шаг к надёжности — разделить сбои по природе, потому что реагировать на них надо по-разному. Слепой ретрай всего подряд одинаково вреден.
| Класс | Пример | Реакция |
|---|---|---|
| Транзиентная | Таймаут, 503, обрыв сети | Повторить с задержкой |
| Лимит (rate limit) | 429 от API | Повторить, уважая Retry-After |
| Данные | Нет обязательного поля, битый артикул | В карантин, уведомить |
| Логика | Товар не найден, нет цены | Отложить, разобрать вручную |
| Фатальная | Неверный токен, 401/403 | Стоп, алерт админу |
Транзиентные ошибки лечатся повтором, ошибки данных повтором не лечатся — сколько ни повторяй кривой артикул, он не станет валидным. Их надо изолировать.
Ретраи с экспоненциальной задержкой
Для транзиентных ошибок применяют повтор с экспоненциальным backoff и джиттером. Это защищает внешний API от лавины одновременных повторов и даёт ему время восстановиться.
- Задержки растут: 1с → 2с → 4с → 8с → 16с (с ограничением сверху).
- Джиттер — случайная добавка, чтобы повторы не били синхронно.
- Ограничение числа попыток: например, 5, после чего задание уходит в dead letter.
В 1С-Битрикс повторы удобно реализовать через собственную таблицу заданий обмена с полями attempts, next_retry_at и status. Агент или cron выбирает задания, у которых наступило время следующей попытки.
Идемпотентность как основа повторов
Повторная синхронизация безопасна только если операция идемпотентна — её повторное применение даёт тот же результат, что и однократное. Без этого каждый ретрай грозит дублем заказа или двойным списанием остатка.
- Перед созданием сущности — проверка по внешнему ключу: есть — обновляем, нет — создаём (upsert).
- Уникальный идентификатор операции (idempotency key) в журнале обработанных.
- Складские движения — через документы, а не прямое изменение остатка.
Хороший маркер — хэш полезной нагрузки. Если задание с тем же хэшем уже применено, повтор просто помечается выполненным без реальной операции. Это делает любой ретрай безопасным по построению.
Карантин и dead letter queue
Задания, которые исчерпали попытки или содержат битые данные, нельзя терять и нельзя оставлять в основной очереди. Их отправляют в карантин (dead letter) — отдельное хранилище проблемных сообщений.
- Задание помечается статусом
failedс сохранением полезной нагрузки и текста ошибки. - Администратор получает уведомление (почта, Telegram, лог).
- После исправления причины задание можно переотправить вручную одной кнопкой.
Ключевая ценность dead letter — исходные данные никогда не пропадают. Даже если обмен упал на сотне заказов, все они лежат в карантине и восстанавливаются после устранения причины, а не теряются молча.
Безопасная повторная синхронизация
Иногда нужно переобменять данные целиком — после долгого простоя, миграции или массовой правки. Такую пересинхронизацию проводят по правилам, чтобы не устроить шторм.
- Батчами. Не всё сразу, а порциями по N позиций с паузами, чтобы не положить API и сайт.
- По приоритету. Сначала критичное (остатки, активные заказы), потом остальное.
- С контролем расхождений. Сравнить состояние до и после, зафиксировать, что изменилось.
Для точечного восстановления полезен инкремент по дате изменения: переобмениваются только записи, изменённые после метки последнего успешного обмена. Полная переливка — крайняя мера и только в окно низкой нагрузки.
Логирование и алерты
Без логов ошибка невидима, а без алертов о ней узнают от покупателя. Обмен должен быть наблюдаемым.
- Структурный лог каждой операции: время, тип, ключ сущности, результат, длительность, текст ошибки.
- Уровни: info для успеха, warning для ретраев, error для карантина, critical для фатальных сбоев.
- Алерты на рост ошибок и на фатальные события — в почту или мессенджер.
В 1С-Битрикс для служебных записей подходит журнал событий, но для интенсивного обмена лучше вести собственную таблицу лога с ротацией — так проще фильтровать по сущности и строить отчёты. Порог алерта задают по доле ошибок, а не по абсолютному числу.
Итог
Устойчивый обмен — это не отсутствие ошибок, а способность их пережить. Опоры надёжности: классификация сбоев, ретраи с backoff для транзиентных ошибок, идемпотентность операций, карантин (dead letter) для неисправимых заданий и наблюдаемость через логи и алерты. Повторная синхронизация проводится батчами по watermark, а не слепой полной переливкой.
Мы в B2Bsite проектируем обмен так, чтобы он восстанавливался сам: добавляем очереди с повторами, карантин, журналы и уведомления, реализуем безопасную пересинхронизацию. Если ваша связка регулярно «отваливается» и данные приходится править руками — сделаем её отказоустойчивой.
Частые вопросы
Какие ошибки обмена можно повторять автоматически?
Только транзиентные: таймауты, обрывы сети, коды 503 и 429. Ошибки данных (битый артикул, отсутствие поля) повтором не исправить — их отправляют в карантин на ручной разбор.
Что такое экспоненциальный backoff?
Стратегия повторов, где задержка между попытками растёт (1, 2, 4, 8 секунд) с добавлением случайного джиттера. Это не даёт повторам бить синхронно и даёт внешнему API время восстановиться.
Зачем нужна dead letter queue?
Чтобы задания, исчерпавшие попытки или содержащие битые данные, не терялись и не забивали основную очередь. Их полезная нагрузка сохраняется, а после исправления причины задание переотправляют вручную.
Как повторная синхронизация не создаёт дубли?
За счёт идемпотентности: перед созданием сущность ищут по внешнему ключу и обновляют, а не создают заново. Дополнительно ведут журнал обработанных операций по уникальному ключу или хэшу.
Что такое watermark в обмене?
Метка времени последнего успешного обмена. После сбоя переобмениваются только записи, изменённые позже этой метки, что позволяет догнать ровно пропущенное, а не гонять весь каталог.
Где вести лог обмена в 1С-Битрикс?
Для служебных записей подходит журнал событий, но при интенсивном обмене удобнее собственная таблица лога с ротацией — по ней проще фильтровать по сущности и строить отчёты об ошибках.
Как узнавать о сбоях обмена вовремя?
Настроить алерты на рост доли ошибок и на фатальные события (401, 403, неверный токен) с отправкой в почту или мессенджер. Порог задают по доле ошибок, а не по абсолютному числу.
Поможем с настройкой и поддержкой Интеграции и связки систем
Поможем с настройкой, доработкой и поддержкой Интеграции и связки систем.