Запись есть, сообщения нет
Сервис сохранил заказ и упал до отправки в учёт. В базе заказ есть, в 1С нет, и узнают об этом по звонку клиента.
Заказ записан в базу, а в учёт не ушёл. Или ушёл дважды. Или пришла отмена раньше самого заказа. Это не редкие сбои, а обычное поведение сети и процессов, и обмен между вашими системами нужно строить так, чтобы это переживать. Мы проектируем и пишем такой обмен: сообщение записывается вместе с данными, доставляется до подтверждения, повтор не создаёт дубль, а то, что застряло, видно человеку. Где хватит простой схемы без брокера, так и скажем.
Обследование обмена — от 200 000 ₽, 2–3 неделиПроверка отказами: убиваем процесс между записью и отправкойИсходный код в вашем репозитории с первого коммита
Сервис сохранил заказ и упал до отправки в учёт. В базе заказ есть, в 1С нет, и узнают об этом по звонку клиента.
Отправка не получила ответа и повторилась, хотя первая дошла. Склад собрал два заказа, разбирать приходится вручную.
Отмена заказа пришла раньше самого заказа, и обработчик её выбросил. Заказ остался живым, хотя клиент от него отказался.
Сообщения копятся, часть обработчиков давно падает, и никто об этом не знает.
Гарантия строится на каждом участке пути, а не в одном месте.
Слово «гарантированная» легко понять как «ровно один раз». Так не бывает.
Сеть не отличает потерянное сообщение от потерянного ответа, поэтому выбрать «не терять и не повторять» нельзя. Для данных, которые нельзя терять (заказы, изменения остатков, документы), берётся схема «доставить хотя бы раз» и поверх неё защита от дублей. Эффект «ровно один раз» получается из двух частей: отправитель повторяет до подтверждения, а получатель узнаёт то, что уже обработал.
Уровень выбирается для каждого типа сообщений, а не для всей системы: заказ идёт по третьему, уведомление клиенту по второму, метрика по первому. Список записывается на обследовании, потому что от него зависит объём разработки.
Основная ошибка обмена — два независимых действия подряд: записать в свою базу и отправить посреднику. Между ними всегда есть окно, в которое попадает падение процесса. Outbox убирает окно: сообщение записывается в таблицу той же базы в той же транзакции, что и данные. Либо есть и данные, и сообщение, либо нет ни того ни другого. Отдельный процесс читает таблицу, отправляет сообщения, ждёт подтверждения и только потом отмечает их отправленными. Если он упал, сообщения остались в таблице и будут отправлены после запуска.
Цена небольшая: одна таблица, один процесс-отправитель и дубли при повторах, которые закрывает получатель. Зато исчезает класс ошибок «заказ есть, сообщения нет». Выбор между очередью и событиями в архитектуре в целом описан на странице про микросервисы и высоконагруженные системы; здесь разбираем сам обмен.
Защита от дублей лежит на получателе: отправитель может только повторять. Получатель записывает идентификатор сообщения в базу в той же транзакции, что и результат, и повтор находит запись и возвращает прежний итог. Где есть бизнес-ключ, например номер заказа партнёра, дубль отсекает ограничение базы на повтор значения. Для передачи состояния хватает номера версии, а простые операции делаются так, чтобы повтор был безвреден: «установить статус», а не «изменить статус». Какой приём где, решаем по каждому типу сообщений.
Гарантия доставки без видимости превращается в тихую потерю. Поэтому вторая половина работы — то, что видит человек.
Повтор идёт с нарастающей паузой и пределом числа попыток. Пауза нужна, чтобы не добить недоступную систему шквалом запросов, предел — чтобы одно «ядовитое» сообщение, которое не обработается никогда, не блокировало остальные. После исчерпания попыток оно уходит в отдельный список для разбора.
Причины отказа обрабатываются по-разному. Получатель недоступен: повторяем позже. Неизвестный справочник: повтор бесполезен, нужен человек, который заведёт соответствие. Неверный формат: отвечаем отправителю и записываем причину.
Человек, а не программист, должен видеть для каждого типа сообщения: что застряло, с какого времени, по какой причине и что можно сделать. Минимальный набор: список с фильтром по типу и возрасту, текст причины понятным языком, кнопки «повторить» и «отклонить с комментарием». Обмен с партнёрами в форматах оператора и AS2 вынесен отдельно, см. страницу про EDI-интеграции; здесь речь об обмене между вашими собственными системами и сервисами.
Раз в сутки две системы сверяются по числу сообщений, суммам и выборке записей, а расхождение попадает в журнал, и в регламенте записано, кто его разбирает. Сверка ловит то, о чём схема не знает: опечатку в соответствии справочников, ручное исправление в учёте, забытую ветку кода.
Выбор посредника записывается на обследовании вместе с тем, кто будет им управлять после сдачи. Названия даны как классы решений, без версий и цифр производительности.
Останавливаем отправитель между записью и отправкой, получатель между обработкой и подтверждением, посредника посреди потока. После запуска ни одно сообщение не потеряно и не двоится.
Каждое сообщение отправляется дважды и трижды, в разном порядке; результат должен быть один. Обязательная часть приёмки для заказов и остатков.
Старый и новый обмен работают рядом, результаты сравниваются по заказам и суммам. Расхождения разбираем до переключения.
Цены — по тарифам. Точная цена называется у обследования, дальше вилка, которая сужается по его результатам. Остановиться можно после любой ступени.
Карта сообщений между двумя-тремя системами, места потерь и дублей, уровень гарантии по типам, схема, вилка бюджета. Вычитается из первого этапа, если продолжаете с нами.
То же для цепочки из нескольких систем, с матрицей источников данных и оценкой нагрузки.
Один поток, например заказы в учёт, с outbox, повторами, защитой от дублей и экраном разбора на реальных данных.
Несколько потоков, посредник, сверка, мониторинг очередей, испытания отказами, параллельный прогон.
Перевод потоков по одному, опытная эксплуатация, регламент разбора, передача документации.
Мониторинг очередей и задержек, разбор инцидентов, плановые доработки с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.
Собираем перечень сообщений, участников и мест, где данные уже терялись или двоились. Берём реальные случаи из журналов. На выходе уровень гарантии по каждому типу и вилка бюджета.
Формат сообщений, идентификаторы, правила повтора, список ошибок и действие человека на каждую. Согласуем с владельцами принимающих систем.
Один тип сообщений проходит весь путь на реальных данных.
Останавливаем процессы, повторяем сообщения, меняем порядок, накапливаем очередь. Результат записывается в протокол, который остаётся у вас.
Переключаем потоки по одному, старый обмен остаётся рядом до сверки.
Регламент, мониторинг и инструкция передаются вам; сопровождение берём по договору с часами.
Десять потоков между пятью системами стоят больше, чем десять отдельных потоков: добавляются порядок, версии и общие справочники.
Если у получателя есть интерфейс с идентификаторами запросов, защита от дублей проще. Если система умеет только загрузку файла, часть работы уходит на обход.
Чем больше потоков требуют обработки «один раз по эффекту», тем больше разработки и испытаний.
Накопленные дубли и расхождения нужно разобрать до включения новой схемы.
Если нужно связать учётную систему с сайтом и складом, начинают с интеграции 1С: там обмен проектируется под конкретные конфигурации. Если сообщения идут к внешним партнёрам в форматах оператора и по каналам вроде AS2, это EDI-интеграция. Если нужен интерфейс для чужих систем, смотрите разработку API и бэкенда.
Эта страница про надёжность самого обмена, каким бы ни был формат и канал. Если сначала нужно понять, как устроена система, начните с аудита кода и архитектуры: часто именно он показывает, что обмен устроен как два действия подряд.
Как описывать ошибки, версии и повторы так, чтобы партнёр не получал дубли. Пригодится, если у вас внешний интерфейс.
Какую сложность распределённости вы покупаете и когда обмен через сеть оправдан.
Часть причин расхождений на самом деле относится к потерянным и задвоенным сообщениям.
Сорок минут созвона: какие системы обмениваются, что уже терялось или двоилось и как вы узнаёте об этом. Скажем, нужен ли брокер и с какой ступени начинать.
Что сообщение не пропадёт при сбое отправителя, посредника или получателя: оно сохраняется, доставляется до подтверждения, а повтор не создаёт дубль. Строго «один раз» сеть не обеспечивает, поэтому гарантия складывается из повторов и защиты от дублей у получателя.
Таблица «исходящие» в вашей же базе. Сервис записывает данные и сообщение в одной транзакции, а отдельный процесс затем отправляет сообщения и отмечает их отправленными. Если процесс упал, ничего не потеряно: сообщения лежат и ждут.
Не всегда. Для небольшого потока хватает таблицы в базе с процессом-отправителем. Брокер оправдан, когда много обработчиков, нужны приоритеты и отложенные повторы, а Kafka только когда поток нужно хранить и перечитывать.
У каждого сообщения свой идентификатор, получатель запоминает обработанные в той же транзакции, что и результат, а повтор возвращает прежний итог. Дополнительно ставится ограничение базы на повтор бизнес-ключа, например номер заказа партнёра.
Обследование — 200 000 ₽ за 2–3 недели (350 000 ₽ при нескольких системах), лёгкий пилот одного потока — 150 000–400 000 ₽, тяжёлый пилот с цепочкой и посредником — 400 000–1 200 000 ₽. Вывод в эксплуатацию — от 1 500 000 ₽ этапами. Обследование вычитается из первого этапа, если продолжаете с нами.
Часто да. Outbox и защиту от дублей добавляют на границе: меняется способ записи и отправки, а не бизнес-правила.
EDI — обмен с внешними партнёрами в согласованных форматах через оператора, AS2 или SFTP. Гарантия доставки — свойство обмена вообще, в том числе между вашими сервисами и системами. Принципы одни, но у EDI добавляются форматы и подтверждения партнёра.
Ежемесячно: 20 000, 60 000 или 120 000 ₽ в месяц, до 4, 12 или 25 часов. Часы идут на мониторинг очередей и разбор застрявших сообщений; сверх пакета — 5 000 ₽ в час. Круглосуточной дежурной смены у нас нет.
Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.