← Все статьи

SiteGuard12 мин чтения

Карта зависимостей сайта: как понять, чей сбой остановит заявки и заказы

Карта зависимостей сайта связывает действия посетителей с системами, от которых зависит их результат. Она показывает, что произойдёт при отказе оплаты, базы, CRM или отправки уведомлений, кто должен реагировать и какой обходной путь действительно подготовлен. Практический итог — список решений, которые помогают сохранять заявки и восстанавливать заказы.

Сайт может открываться, кнопка — нажиматься, а заявка так и не попадать менеджеру. Возможна и обратная ситуация: CRM недоступна, но заказы надёжно сохранены и будут переданы позже. Чтобы отличить эти случаи, нужен реестр интеграций сайта с понятными связями, условиями успеха и ответственными. Ниже разберём, как собрать такую карту для обычного коммерческого проекта.

Начните с результата, который обещаете посетителю

Первый вопрос звучит так: какое действие человек должен завершить и чем это подтверждается? Для формы недостаточно исчезновения индикатора загрузки. Нужны сохранённая заявка, её идентификатор и понятный порядок дальнейшей обработки. Для заказа отдельно определяются сохранение состава, состояние оплаты и передача в исполнение.

В главе Google SRE о надёжных запусках предлагается разбирать путь запроса, зависимости, владельцев общей инфраструктуры и последствия отказов. Для владельца сайта это можно превратить в короткое упражнение: пройти одно действие от браузера до фактического результата и назвать каждый необходимый переход.

Выберите несколько сценариев: отправка заявки, оформление заказа, оплата, получение цифрового товара или вход в кабинет. Не объединяйте их в одну строку «сайт работает». У сценариев могут быть общие компоненты, разные допустимые задержки и разные последствия ошибки.

Установите также момент окончания сценария. Если обещано отправить предложение после обработки менеджером, получение формы сервером является только промежуточным событием. Карта должна доходить до того состояния, за которое бизнес готов отвечать перед клиентом.

Не ограничивайтесь серверными обращениями. Часть зависимостей работает в браузере: внешний скрипт может строить форму, выполнять проверку адреса или открывать платёжный интерфейс. Если такой ресурс недоступен, запрос до вашего приложения вообще не дойдёт. Отдельно выясните, что произойдёт при блокировке ресурса браузером или ошибке выполнения скрипта. Для наблюдения полезен воспроизводимый путь пользователя, а для поиска причины — сведения о сетевых запросах и ошибках интерфейса. Простой список серверных API эту часть карты не заменяет.

Что включить в реестр интеграций

Для первого варианта достаточно таблицы и краткого описания связей. Один компонент может участвовать в нескольких сценариях, поэтому полезно иметь его устойчивое название. Строка связи объясняет, какая функция его вызывает, какие данные передаёт и чего ожидает в ответ.

ПолеПример заполненияЗачем нужно
Функция и результатЗаявка сохранена и доступна обработкеПроверить пользовательский смысл
ЗависимостьСервис приёма заявок и основная базаНайти конкретный участок
Режим связиОтвет нужен сразу; передача в CRM выполняется позжеПонять момент возможной задержки
Признак отказаНет записи, ошибка запроса или просроченная передачаВыбрать наблюдение
Поведение при сбоеЯвный отказ либо сохранение с отложенной обработкойИсключить ложное подтверждение успеха
Владелец и эскалацияОтветственный разработчик и резервный контактНачать восстановление без поисков

Дополните реестр допустимым ожиданием, ограничениями повторов, условиями резервного пути и датой последней проверки. Для внешней интеграции сохраните ссылку на документацию, идентификатор используемого аккаунта и канал поддержки. Пароли и ключи в такую таблицу не помещают: достаточно ссылки на контролируемое место хранения доступа.

Источниками служат конфигурация приложения, настройки интеграций, журналы запросов, фоновые задания и объяснения разработчиков. Подпишите, какие связи подтверждены, а какие пока предполагаются. Отсутствие запросов в коротком наблюдении не доказывает отсутствия зависимости: редкая операция может запускаться только после оплаты или по расписанию.

Пример карты: заказ, оплата, CRM и уведомления

Рассмотрим вымышленный магазин. Приложение сначала сохраняет заказ в собственной базе, затем предлагает оплату. Передача заказа в CRM и письмо клиенту выполняются фоновыми обработчиками. Подтверждение платёжного состояния поступает отдельным серверным событием и сверяется с данными провайдера. Это учебная архитектура, а не требование строить каждый магазин одинаково.

ЭтапЗависимостьПодтверждение результатаВозможное последствие отказа
Сохранить заказПриложение и базаЗаказ записан с устойчивым номеромНельзя обещать, что заказ принят
Начать оплатуAPI платёжного провайдераСоздана связанная платёжная операцияЗаказ ожидает оплаты; состояние запроса уточняется
Подтвердить оплатуСобытие провайдера и обработчикПроверенное платёжное состояние связано с заказомДеньги могли поступить, но исполнение задержится
Передать менеджеруОчередь, обработчик, CRMЗапись создана и сопоставлена с исходным заказомМенеджер не начинает работу вовремя
Уведомить клиентаОбработчик и почтовый сервисЗафиксирован результат отправки по принятому критериюКлиент не получает ожидаемое сообщение

Из карты сразу видны разные границы. Недоступная CRM не обязана останавливать сохранение заказа, если отложенная передача действительно реализована и контролируется. Но потеря фонового задания сделает такую архитектуру лишь видимостью устойчивости. Нужны сохранённое намерение передать заказ, наблюдение за исполнением и возможность сверить пропуски.

Возвращение покупателя на страницу «Спасибо» тоже не следует считать единственным подтверждением оплаты. В учебной схеме состояние проверяется серверной логикой. Карта фиксирует оба направления: исходящий запрос к провайдеру и входящее событие. Если учесть только первый переход, часть реальных отказов останется вне рассмотрения.

Уведомления разделите по назначению. Письмо с рекламной рекомендацией и сообщение с единственным способом получить купленный цифровой товар имеют разную значимость. Даже при использовании одного почтового сервиса их последствия и требования к восстановлению отличаются.

Как определить критические зависимости веб-приложения

Назначайте критичность по последствиям для конкретного сценария. Удобно различать немедленную остановку результата, допустимую задержку до установленного срока и потерю дополнительного удобства. Эти категории являются рабочим соглашением команды, а не универсальной классификацией.

Синхронная связь не делает зависимость автоматически критичной. Сервис рекомендаций может отвечать в ходе открытия страницы, но при его отказе блок можно скрыть. И наоборот: асинхронный обработчик выдачи электронного билета может быть необходим для исполнения покупки, хотя покупатель не ждёт его HTTP-ответа.

Для каждой связи задайте вопросы: что увидит клиент, можно ли сохранить его намерение, сколько допустимо ждать и что потеряется без восстановления? Отдельно оцените риск повреждения данных и повторного действия. Иногда безопаснее временно остановить операцию, чем показать успех при неизвестном результате.

Критичность может меняться со временем. В нашем примере задержка передачи в CRM на несколько минут допустима, если менеджер получает заказ в согласованный срок. После его превышения тот же технический сбой становится нарушением процесса. Срок берётся из реальной работы бизнеса, а не из удобного значения в панели мониторинга.

Что записать о тайм-ауте и работе с ограниченными функциями

Для внешнего вызова укажите, сколько приложение ждёт соединения и ответа, что происходит после ожидания и разрешён ли повтор. В материале AWS о тайм-аутах и повторах объясняется, почему длительное ожидание удерживает ресурсы, а агрессивные повторы могут усиливать перегрузку. Поэтому запись «повторяем при ошибке» для карты недостаточна.

Допустим, в учебном сценарии подсказку адреса ждут не более двух секунд, затем предлагают ручной ввод. Сам ручной ввод должен работать без того же сервиса подсказок. Иначе нарисованная альтернатива не станет настоящим обходным путём. Значение времени здесь условное; его выбирают по требованиям интерфейса и наблюдаемой работе интеграции.

Для расчёта доставки запасным поведением может быть обращение менеджера с уточнением условий, если бизнес способен выполнить это обещание. Показывать случайную стоимость или устаревшую доступность товара ради завершения формы опасно для качества заказа. При использовании сохранённых данных заранее определите допустимую давность и явное обозначение предварительного результата.

Ограниченное функционирование требует понятного сообщения посетителю: что сохранено, что ещё проверяется и какое действие нужно дальше. Запишите его рядом с техническим правилом. Это позволяет заранее согласовать поведение между разработкой, поддержкой и продажами.

Почему фоновые части нельзя оставить за пределами карты

Для каждой отложенной операции укажите три состояния: намерение надёжно сохранено, обработка началась, результат достигнут. Сам факт отправки задания в очередь не подтверждает создание записи в CRM. Принятие письма почтовым сервисом также не доказывает, что адресат прочитал его.

Проверьте разрыв между сохранением заказа и постановкой фонового задания. Если приложение успело записать заказ, но упало до передачи задания, кто найдёт пропущенную работу? В карте должна быть ссылка на механизм согласованного сохранения либо последующей сверки. Для владельца бизнеса важен проверяемый ответ, а конкретную реализацию выбирает разработчик.

Запишите допустимый возраст ожидающей операции и способ обнаружить зависание. Нужны не только общее число заданий, но и связь с исходными заказами. Пять старых оплаченных заказов могут требовать более срочной реакции, чем большая партия необязательных уведомлений.

Резервный ручной процесс тоже нанесите на карту. Кто выгрузит сохранённые заявки, где менеджер отметит обработку и как после восстановления CRM будут устранены дубли? Без этих шагов фраза «обработаем вручную» скрывает новую зависимость от человека, доступа и правил сверки.

Как найти общие точки отказа

После разбора отдельных сценариев посмотрите, какие ресурсы повторяются. Сохранение заказа, обработка платежа и передача в CRM могут использовать одну базу, очередь, сеть или общий набор подключений. Отказ такого элемента затронет несколько ветвей, даже если у каждой нарисован отдельный сервис.

В описании шаблона Bulkhead в Microsoft Learn рассматривается разделение ресурсов, чтобы проблемы одной зависимости не исчерпывали возможности остальных. Практический вопрос для карты: может ли зависшая отправка писем занять все рабочие процессы и остановить приём заказов? Если да, логически необязательная функция получает опасное влияние через общие ресурсы.

Учитывайте также зависимости восстановления. Панель управления, система доступа и хранилище секретов могут не участвовать в каждом заказе, но понадобиться для переключения или перезапуска. Пометьте их отдельной ролью. Работоспособный сайт и возможность восстановить его после аварии — разные условия, которые важно проверять.

Не вычисляйте доступность всей цепочки простым перемножением рекламных процентов сервисов. Такое действие требует совместимой модели событий и допущений о независимости, которых у общей инфраструктуры обычно нельзя предполагать. Для решений полезнее конкретные совместные отказы, подтверждённые условия обслуживания и результаты проверки выбранного сценария.

Как проверить, является ли резерв настоящим

Два сервера не обязательно защищают от двух разных причин отказа. Если оба находятся на одном узле, используют один сетевой путь или зависят от одной базы, соответствующая общая проблема остановит оба. Но размещение у одного провайдера само по себе не делает резерв бесполезным: разные зоны могут защищать от части локальных отказов.

В реестре укажите, от какого события должен помогать резерв: отказ процесса, узла, зоны, региона, аккаунта или поставщика. Затем проверьте, какие зависимости остаются общими. Даже сервисы разных компаний могут использовать один механизм доступа, общий домен или один источник данных вашего приложения.

Рядом с резервом запишите способ переключения, необходимые полномочия, состояние данных и способ возврата. Если резерв хранит старую копию заказов, он может восстановить открытие страниц, но потерять смысл для исполнения новых покупок. Требования к данным определяются отдельно от доступности интерфейса.

Проверка должна включать и достаточность ресурсов. Запасной экземпляр, который справляется только с небольшой долей обычной нагрузки, не подтверждает возможность полного переключения. Не обязательно сразу покупать двойную инфраструктуру: сначала определите, какие функции будут доступны в ограниченном режиме и какие обещания можно выполнить.

Проверьте и сам механизм включения резерва. Если переключение требует входа через отказавшую систему авторизации, обходной путь может оказаться недоступен именно тогда, когда нужен. Если решение должен принять единственный подрядчик, выясните порядок действий при его отсутствии. Для каждого такого шага сохраняйте исполнителя, необходимый доступ и проверенное условие завершения. После учения полезно записать, какие действия удалось выполнить по инструкции, а где потребовалось незапланированное вмешательство человека, знакомого с системой.

Оплата: что делать с неопределённым результатом

Тайм-аут платёжного запроса означает отсутствие ожидаемого ответа в срок, но не доказывает, что операция не состоялась. Поэтому ветвь оплаты должна содержать состояние «результат уточняется», источник достоверного статуса и ответственного за сверку. Повторное нажатие кнопки не должно автоматически создавать новую независимую попытку списания.

Как конкретный пример механизма, Stripe документирует идемпотентные запросы, позволяющие распознавать повтор одной операции. Для используемого провайдера проверьте собственные правила ключей, сроки их действия и поддерживаемые операции. Наличие похожего заголовка у другого API не гарантирует одинакового поведения.

Особенно внимательно описывайте переключение на второго платёжного партнёра. Ключ у первого провайдера не превращается в общую защиту между двумя независимыми системами. Пока результат первоначальной операции неизвестен, новый платёж может создать повторное списание. Безопасный резерв требует согласованной логики состояния и сверки, а не только второй кнопки.

После восстановления сопоставьте платёжное состояние, заказ и дальнейшее исполнение. Раздельные зелёные статусы API не доказывают, что конкретный клиент получил правильный результат. Сохраните идентификаторы связанной операции, чтобы поддержка могла разобраться в одном обращении.

Кто отвечает за каждую зависимость

Для важной связи назначьте внутреннего владельца, технического исполнителя и резервный контакт. Владелец принимает решение о режиме работы и коммуникации с клиентами. Исполнитель диагностирует и меняет систему. В маленькой команде роли могут совмещаться, но ответственность должна оставаться явной.

Для внешнего поставщика укажите канал обращения, часы доступности поддержки, данные нужного аккаунта и информацию для заявки. Практический набор: время начала, затронутая операция, идентификаторы примеров и наблюдаемый ответ. Отправляйте только необходимые диагностические сведения, сохраняя клиентские данные в разрешённых каналах.

Определите условия эскалации: что делать, если основной исполнитель не отвечает, поставщик не подтверждает проблему или допустимая задержка уже превышена. Публичная статусная страница партнёра полезна как дополнительное свидетельство, но отсутствие сообщения на ней не отменяет воспроизводимую ошибку вашего сценария.

Храните инструкции так, чтобы отказ основной системы не лишал команду доступа к ним. Если контакты и порядок восстановления доступны только через неработающую CRM, сама документация становится зависимостью. Проверяйте резервный доступ вместе с техническими процедурами.

Как превратить карту в практический план

Выберите несколько наиболее существенных отказов и проверьте их в контролируемой среде: недоступность CRM, медленный ответ расчёта доставки, потерю подтверждения платежа, остановку фонового обработчика. Для каждого заранее запишите ожидаемый результат. Проверка должна подтверждать сохранность данных и понятное поведение, а не только отсутствие ошибки на странице.

Проверяйте несколько проявлений отказа одной зависимости. Мгновенная ошибка, медленный ответ, успешный HTTP-статус с непригодными данными и запрет доступа могут запускать разные ветви приложения. Например, обработчик корректно переживает недоступность CRM, но бесконечно ждёт её медленный ответ. Или принимает пустое значение цены как настоящий результат. Для каждого случая определите, какое состояние сохраняется и как оно будет обнаружено. Не требуется моделировать все возможные аварии: начните с вариантов, способных изменить обещание клиенту или повредить данные.

Разделите доказательства: конфигурация подтверждает настройку, журнал — наблюдавшееся событие, испытание — поведение в конкретных условиях. Подпишите дату и границы проверки. Утверждение «резерв работает» без указания проверенного отказа мало помогает при следующем инциденте.

  • Убрать лишнюю блокировку: необязательный сервис не должен мешать сохранению заказа без обоснованной причины.
  • Подготовить контролируемую задержку: сохранять задания и проверять завершение в допустимый срок.
  • Защитить данные: исключить повторные операции и предусмотреть сверку неопределённых результатов.
  • Уточнить резерв: проверить общие зависимости, переключение и актуальность данных.
  • Закрепить ответственность: назначить владельца конкретного улучшения и условие его завершения.

После добавления интеграции, изменения оплаты или переноса инфраструктуры обновляйте затронутые связи. Полезно включить в завершение такой задачи вопрос: какой сценарий изменился и кто проверил новое поведение при отказе? Тогда карта будет описывать действующую систему, а не первоначальный проект.

Полезный итог для владельца сайта — короткая очередь решений с объяснением последствий. Например: убрать обязательное ожидание CRM при сохранении заявки, добавить контроль завершения передачи, подготовить ручную сверку оплат и проверить переключение при отказе доступа. У каждого решения должны быть исполнитель и признак готовности. Не стремитесь немедленно продублировать все сервисы: сначала устраните ситуации, в которых небольшой отказ лишает бизнес заявок, хотя архитектура позволяет сохранить их и обработать позже.

Какие проверки выбрать по готовой карте

Для каждого критичного результата определите наблюдение снаружи и необходимые внутренние свидетельства. Открытие страницы проверяется иначе, чем сохранение заявки; завершение фоновой операции требует собственного контроля. Один успешный ответ главной страницы не подтверждает всю цепочку заказа.

Подключите SiteGuard для внешнего HTTP-контроля доступности важных URL, выбранных по карте зависимостей. Внутренние этапы обработки проверяйте средствами приложения.