// личный канал‑лог
gavrilovlog
← все записи

Разделение API для разных типов клиентов

👁 4802💬 12
Во многих проектах, где было несколько типов клиентов, например Web, Mobile и например публичный доступ к данным. В этих проектах мы использовали единое АПИ для всех подключений. Но в этом варианте как есть плюсы, так и минусы. Плюсом является то что мы упрощаем поддержку, имея только один backend для всего. Минусом является зависимость этих сервисов друг от друга. Например если мы вносим какое-то изменение для версии web, то мы должны быть уверены, что это изменение совместимо с другими клиентами. Еще из-за такой зависимости у нас была проблема с тем, что API часто попадало под DDOS атаку через web форму и тем самым все остальные клиенты тоже страдали. В связи с этим, мы решили разделить в первую очередь Public API. Вынеся туда основные методы для работы с нашим сервисом и уведомив всех партнеров об этом. НО с мобильным приложением стало сложнее. Поскольку URL обращения был зашит внутри билда аппки. Следовательно мы могли этот url поменять только в следующей версии, но не факт что все пользователи обновятся на новое приложение и поэтому мы обязаны были поддерживать уже 2 варианта АПИ для мобильного приложения. Стало ли нам от этого проще жить? И да и нет, со временем мы все таки избавились от старых методов для мобилки, но на это потребовался очень долгий период, чтобы убедиться, что более 90% наших пользователей уже перешли на новую версию. Такие архитектурные изменения всегда боль, но они необходимы, как говорится “Меняйся или умри”. В новых проектах я стал сразу разделять эти АПИ, во многих случаев я просто дублирую сервис на еще один поддомен для каждого типа клиента и таким образом, в будущем если потребуется вносить конкретные изменения для одного из типов клиента, это не внесет дополнительных проблем с миграцией и версионированием. Обсуждаем тут: @kyb_chat Подписываемся тут: @knowyourbackend

Комментарии · 12

  • @superadmin0777
    Интересно как защищались от DDOS?
    • @gavrilovlog
      В основном это CloudFlare и горизонтальное динамическое масштабирование.
      • @superadmin0777
        rate limiter пробовали?
        • @shaurgon
          Rate Limiter в CF достаточно странный. Там только 6 правил и отвечать можно только статичной страницей.
  • @someexample
    Вопрос, а нормальный ли подход сначала реализовать один api и уже потом разделять на платформы если в команде мало разработчиков?
    • @gavrilovlog
      Конечно нормально, нет ничего не нормального вообще. Вопрос только в компромиссах. С какими сложностями мы в итоге столкнулись я описал в посте. Что переход на разделенное АПИ был долгим и сложным процессом. Однако в самом начале поддерживать сразу все версии апи для разных типов клиентов кажется не целесообразным. Поэтому я просто выкатываю одно приложение сейчас и дублирую его на поддомены для каждого из типов клиентов.
  • @shaurgon
    Есть такая штука, Headless CMS, по сути, это бэкенд для любого типа фронта
    • @gavrilovlog
      ты пробовал?
      • @shaurgon
        Тыкался ради экспериментов. Не скажу, что решение прям ВАУ, но небольшие проектики потянет. Их на Jamstack приличное количество, выбирай любую
  • @this_just_cat
    А почему бы не версионировать апи. some.app/mobile-api/(v1/v2/v...)
    • @gavrilovlog
      Да это так и происходит
  • @this_just_cat
    ну и тушить беки по мере устаревания. Или подрезать функции исходя из устаревания.