06 октября 2025 г.
Взаимодействие со смежными системами
Здравствуйте! Меня зовут Дима Кривопальцев. Я руковожу бэкенд-разработкой в Яндекс Диске. Тема этого выпуска — интеграция со смежными системами. Сегодня мы поговорим, почему 9 из 10 интеграций оборачиваются проблемами. И как стать тем самым десятым. Под смежными системами будем понимать всё, что разрабатывается за пределами вашей команды. Например, это может быть поиск по данным вашего сервиса, который разрабатывается соседняя команда, или интеграция с сервисом, который разрабатывается за пределами вашей компании.
Почему это важно? Без интеграции невозможны многие пользовательские сценарии, к которым мы привыкли в современном мире. Может показаться, что проблемы в смежной команде вас не очень касаются. Но на самом деле это не так, потому что страдает ваш сервис и ваши пользователи. А хочется, чтобы они всегда были счастливы. Давайте разберемся, с какими проблемами можно столкнуться и как их решить. А в идеале вообще избежать. Рассуждать мы будем на примере одной интеграции в бэкенде Яндекс Диска. Все истории и действующие лица выдуманы, все совпадения с реальностью случайны.
Представим, что мы хотим интегрироваться с сервисом авторизации и на его основе построить фичу «Доступ к файлам и папкам» по ссылкам. На сервис авторизации возложим задачу проверки прав — имеет конкретный пользователь доступ или нет. Тут, в целом, все как обычно. Продукт принес фичу, обсудили ее, оценили, пообщались со смежной командой, договорились с ними о каком-то верхнеуровневом решении. Споректировали это дело, написали код, протестировали, запустили в продакшен. Флоу обычный, примерно как для любой фичи. Но все самое интересное начинается во время эксплуатации.
Мы запустились, все замечательно. Но тут что-то происходит. У смежного сервиса отказала база данных или упали ноды бэкендов. В общем, сервис частично недоступен и генерирует много ошибок. Смежная команда чинит какое-то время, но все это время наша фича не работает. Конечно, можно сказать, что такое со всеми случается, и сейчас коллеги накрутят процессов, мер по улучшению, и такое будет происходить заметно реже. Но давайте подумаем, можно ли было что-то сделать заранее? Может показаться, что этого невозможно избежать. Ведь это не мы разрабатываем эту систему. Но на самом деле, можно смягчить эти проблемы с нашей стороны:
  • Можно сделать фоллбэк на старую логику, если мы мигрировали данные из одной системы в другую
  • Можно выбрать политики более мягкой деградации. Например, в этом случае можно переходить в режим read-only для ссылок. Можно смотреть уже созданные, а вот создавать и модифицировать нельзя
  • Еще можно продумать механизмы снижения нагрузки при проблемах. Например, приоритезировать выполняемые задачи. Предположим, у нас есть асинхронные задачи, которые ожидают пользователь. И их обязательно нужно выполнить немедленно. А есть служебные задачи, вроде очистки данных из базы данных. И если база данных нагружена, то менее важные системные задачи просто не запускаются, чтобы не усугублять ситуацию.
  • Теперь вы знаете несколько способов, как избежать проблем при частичном отказе смежной системы:
  • Во-первых, заранее продумать, как будет вести себя ваша система при проблемах смежной.
  • Во-вторых, при необходимости реализовать механизмы, которые позволят переживать такие проблемы более незаметно для пользователей.
  • Рассмотрим вторую проблему. У смежной системы есть ограничения по нагрузке, что мешает росту вашей. Представим, что начинается PR-компания нашей новой фичи, и ей начинают пользоваться заметно больше людей. Из-за повышенной нагрузки начинаются проблемы у смежной системы авторизации. И наша фича фактически не работает. О, у нас же есть механизм неградации, которую мы сделали на предыдущем шаге! Но он предназначен только для кратковременных проблем. Если у вас каждый день сервис недоступен на запись, это конечно лучше, чем полная недоступность, но все же далеко от желаемого состояния. Получается, что смежная система оказалась не готова к такой нагрузке. Снова кажется, что такого невозможно избежать, но на самом деле есть несколько способов это сделать.
    Стоит заранее обсудить ожидания по нагрузке и таймингам и устранению проблем со стороны смежной команды, чтобы они сразу могли подсветить проблемы и знать о необходимых доработках. А для этого нужно научиться прогнозировать нагрузку. Обычно это нужно сделать по абстрактным вещам, вроде "у нас будет MAU 95 миллионов на эту фичу", а смежной команде вам нужно сказать что-то в духе "будем ходить к вам с рейтом 300 тысяч RPS". А как это сделать мы подробно рассказали в первом выпуске. И самое главное во всем этом — зафиксировать ваши договоренности в месте, которое принято в вашей компании — в вики, в трекере или каком-то другом, потому что договоренности на словах потеряются и при смене команды никто про них знать не будет. И в результате случится беда.

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

  • Научиться заранее прогнозировать нагрузку
  • Синхронизировать ожидания или SLA между системами
  • Зафиксировать договорённости в документации или мониторингах
  • Теперь вы знаете, как решить проблему ограничения смежной системы по нагрузке. Давайте рассуждать дальше. От проблем с нагрузкой и падением смежного сервиса мы себя обезопасили. Наша фича летит, ей пользуется, но почему-то в поддержку при этом сыпется много обращений. Разбираемся, и выясняется, что жалобы на появление данных с задержкой. Оказалось, что в интеграции задействовали уже имеющийся поисковый индекс, который обновляется асинхронно. Раньше проблемы не было, потому что если пользователь загружает файл, то он не хочет его сразу же искать. А тут в этот интекс решили добавить информацию для поиска доступов. И пользователи после выдачи доступа пытались его найти и не видели ожидаемого результата.
    Чтобы этого избежать, нужно понимать полный пользовательский флоу и требования к нему, в том числе и в смежной системе. Только так вы сможете предусмотреть все нюансы работы этого сценария и в вашей системе и поймете, если имеющиеся инструменты не подходят для новой интеграции.
    Давайте дальше. Фича уже год работает как задумана. Проблем с нагрузкой нет. И вот в один из дней коллеги сообщают, что запилили новую фичу — новый тип доступов, который поддерживается в их системе. И он автоматически прорастет в наши ответы. Круто, подумали мы. И в этот же день вся интеграция складывается в ноль. Оказывается, что в их системе тип доступа был строкой, а в нашем мобильном приложении – енам, поэтому сломался парсинг ответов.
    Давайте обсудим, как избежать таких ситуаций. На первых стадиях обсудите, в какие стороны планируют расширяться смежная система. Думайте про хвост старых версий и как на них ничего не сломать. А для потенциально ломающих изменений нужен процесс, который будет делать возможным согласование таких изменений с другой командой. У ваших клиентов наверняка есть интеграционные тесты. Их можно запускать на релизы, в которых вы меняете API. Теперь вы знаете, как решить и эту проблему.

    Между смежными системами могут быть нарушены контракты. Для уменьшения рисков проблем:

  • Заранее продумать и синхронизировать возможный вектор развития интеграции
  • Всегда помнить о "хвосте" старых версий
  • В этом выпуске мы с вами обсудили, какие проблемы со смежными системами могут возникать и как их избежать. Давайте все вспомним. На ранних этапах продумайте нюансы и возможные проблемы при эксплуатации, чтобы заложить их решение в проект. Сделайте чеклист. Договоритесь о порядке и сроках устранения проблем и всех критичных для вас параметров — нагрузке, таймингах, даунтайме и тому подобное. Логируйте все взаимодействия и настройте мониторинги, чтобы узнавать о проблемах с вашими интеграциями. Делайте все это и ваши интеграции станут более надежными. Увидимся в следующих сериях.