Недавно я решил поэкспериментировать с API на нашем сайте CardGames.io и попробовать фреймворк Serverless. Последние несколько лет он стал горячей темой в мире технологий, а я прокрастинировал хотел поддерживать технические навыки в актуальном состоянии и попробовать что-то новое. Поэтому решил потратить несколько часов на изучение Serverless и посмотреть, есть ли смысл в таком размещении API.

Текущая конфигурация


CardGames.io работает на AWS. Все html-страницы, CSS, JavaScript и изображения хранятся на S3. У нас есть API на C#, размещённый на Elastic Beanstalk, он работает на серверах Linux под управлением .NET Core с Docker. Наконец, мы используем CloudFront CDN перед статикой на S3 и API. Ниже приведён счёт EC2 за август 2019 года. У нас есть несколько других инстансов, но API работают на m1.small (да, вероятно, t2.small лучше подходит) с классической балансировкой нагрузки. Если суммировать выделенное красным, то выходит $164,21 в месяц, неплохо. Я даже включил туда EBS, поскольку не уверен, как разбить эти расходы, у нас ведь несколько проектов на EC2.


Счет AWS для Elastic Beanstalk

У нас два окружения с 1-3 инстансами в каждом: активное и неактивное, потому что деплой .NET Core в Docker на AWS занимает несколько минут, так что мы делаем его в неактивной среде, а затем переключаем записи CNAME на недавно развёрнутый. Медленный деплой был одной из причин, по которым я хотел попробовать что-то новое. У нас несколько серверов с приложениями node.js на Beanstalk — и те развёртываются за считанные секунды. Хотелось, чтобы так было и для API.

Переход на Serverless


Я изучил очень хороший учебник по размещению ASP.NET Web API с фреймворком Serverless и обнаружил, что в существующий проект API нужно только добавить простой файл конфигурации, одну зависимость и небольшой класс запуска. Деплой занял секунд двадцать — намного лучше, чем в Beanstalk. Думаю, благодаря встроенной в Lambda поддержке .NET Core (впрочем, только 2.2), тогда как в Beanstalk она поддерживается только если использовать Docker с самостоятельным управлением. В любом случае, я был счастлив, не думая о группах автомасштабирования, max instances и тому подобном.

Тестирование производительности


Serverless на AWS — это Lambda, которая реально хостит ваши функции, и фронт API Gateway, который позволяет добавлять такие вещи, как ограничение скорости, ключи API и многое другое. Я разместил функции Lambda в регионе us-west-2, где и серверы Beanstalk. Затем настроил инстанс CloudFront на маршрутизацию запросов одной из наших игр в новую бессерверную конфигурацию, а другой — в старую конфигурацию Beanstalk. Затем запустил простой тест на двух URL: один Serverless, другой Beanstalk. Оба URL вызывали один и тот же API, сохраняя одно событие в БД. Я запустил 100 запросов для каждого, вот результаты:


Сравнение производительности

В многократных прогонах конфигурация Serverless была на 15% медленнее (если что, я запускал это из Исландии, отсюда большой пинг). Скорость стала разочарованием, но оставалась достаточно высокой — я понял, что есть некоторые накладные расходы на фронт API Gateway перед нашим API: там слишком много функций, даже если мы их не используем. Итак, печально, но не критично!

Цены


Честно говоря, я вообще сначала не думал о ценах. Просто решил, что платить за реальное использование будет наверняка дешевле, чем платить за инстансы 24/7. Поэтому позволил новой бессерверной установке работать несколько дней, а затем начал проверять счета. Упс! Счет за Lambda + API Gateway уже перевалил за сто долларов! Сначала я начал возиться с настройкой Lambda, выделяя ей меньше памяти для экономии, но когда хорошенько посмотрел на происходящее, то стало очевидно, что проблема в шлюзе. Вот тарифы на API Gateway:


Тарифы на API Gateway

Наш API принимает около 10 миллионов запросов в день. Это примерно $35 только на шлюз каждый день. Кроме того, Lambda стоит около $10 в день, хотя это можно уменьшить, выделив меньше памяти. Вместе получается около $45 в день, или $1350 в месяц, против $164 в месяц на Elastic Beanstalk. В восемь раз дороже! Мне нравятся новые технологии и быстрый деплой, но я не собираюсь платить за это дополнительные $1200 в месяц. Назад к Beanstalk!

Вывод


Вероятно, мне следовало заранее ознакомиться с ценами и сделать некоторые математические расчёты! Но конечно, тогда пришлось бы заниматься реальной работой, а не осваивать ценные технические навыки! Уверен, что в каких-то ситуациях API Gateway и Lambda лучше, чем Elastic Beanstalk. Просто это не наш случай. Возможно, если вы используете ключи API, ограничение скорости и другие функции API Gateway, тогда имеет смысл платить $3,50 за миллион запросов. Нам было бы лучше просто поставить нормальный балансировщик нагрузки перед Lambda. Насколько я знаю, это невозможно, для доступа по http к Lambda необходим API Gateway.

Но даже если бы мы просто платили за Lambda, при $10 в день вышло бы $300 в месяц вместо $164. У нас много запросов, но каждый запрос делает очень мало: в основном, один вызов БД на запрос. Возможно, более тяжёлые запросы, которые используют больше вычислительного времени, лучше подходят для Lambda, где вы платите за 100 мс вычислительного времени. Ниже приведен отчёт для одного запроса. Как видите, мы используем 3,50 мс вычислительного времени, но выставляется счёт за 100 мс, это неслабое округление.


Отчёт Lambda для одного запроса

Наконец, я вообще тут не критикую API Gateway, Lambda или Serverless. Просто показываю, что для некоторых рабочих нагрузок они намного дороже, чем скучные старые EC2 и Elastic Beanstalk. На чём мы и останемся. Также вполне вероятно, что есть гораздо лучший или более эффективный способ настроить систему, я ни в коем случае не эксперт по AWS, так что если видите какие-то вопиющие ошибки, обязательно укажите в комментариях.

Комментарии (11)


  1. zelig81
    24.09.2019 14:22
    +3

    Можно сделать все тоже самое только без AWS API gateway: aws.amazon.com/blogs/networking-and-content-delivery/lambda-functions-as-targets-for-application-load-balancers


  1. EvgeniiR
    24.09.2019 14:33

    Под оригинальной статьёй с десяток заплюсованных комментариев о том что автору не нужен AWS API Gateway и этот самый гейтвей стоит конских денег.

    А вообще, мне не очень понятно почему так плюсуют статью с критикой Serverless от человека который сам же признаётся что весь его ресёрч это «решил потратить несколько часов на изучение Serverless»


  1. codecity
    24.09.2019 17:02
    +3

    Как бы понятно, что хорошо для старта но плохо для состоявшегося сервиса. Т.е. на сегодя схема экономии такая:

    1. Сначала юзаете Serverless. Если пользователь пошел — переходите к п. 2. Иначе — не тратите много денег.
    2. Потом лучше Kubernetes как сервис (от DO или подобных).
    3. Далее арендуете сервера у типа hz, платите админу и он вам все ручками настроит + от $50 в мес. за поддержку (ну или на зарплату, если уж совсем все хорошо).
    4. Новый этап — покупаете физ. сервера, ставите на колокейшн.
    5. Ну и если уж совсем все хорошо — делаете свой датацентр как Google.


    1. sevmax
      24.09.2019 18:44
      +3

      Я бы сказал, что на пункте 2 можно и остановится. Очень многие компании используют облака и довольны функционалом. А ещё больше компаний переезжают с физических серверов в AWS и GCP, ибо масштабирование и куча сервисов, упрощающих эксплуатацию инфраструктуры, тот же самый autoscaling, RDS, S3, BigTable, EMR и т.д.
      Поддержка своего парка железных серверов, даже арендованных, сомнительное удовольствие. Когда их количество исчисляется десятками, постоянно какое-либо железо будет выходить из строя и нужен человек, который следит за всем этим на полный рабочий день. При повышении до сотни нужно искать второго человека на полную ставку. И это с учетом того, что фактическую замену сломанного железа производят сотрудники датацентра удаленно.
      Ну а свои сервера, это ещё больше заморочек. Особенно интересна процедура роста инфраструктуры при росте популярности сервиса. Когда приходится сильно заранее заказывать сервера и ставить их в стойки, где они впустую простаивают до тех пор, пока их не введут в эксплуатацию, потому что вырос трафик. Но к этому времени надо уже заказать следующую партию серверов.
      Ну и плюс удалённая замена деталей в таком случае стоит значительно дороже.

      Моё мнение основано на опыте работы со всеми приведёнными конфигурациями.


      1. Shadow0fClown
        25.09.2019 08:17

        Подскажите пожалуйста, а если уже есть небольшой парк собственных серверов (10-15) и собственный штат администраторов и оно уже работает нормально лет 5(деплои/апдейты/секьюрити), то стоит ли пробовать переносить архитектуру на Кубернетес, например в GCP?

        Просто я пока что не могу ответить на главный вопрос: А оно нам вообще надо? И стоит ли менять, то что и так уже работает.
        P.S. Нагрузка не супер большая, во главе угла стоит безопасность данных (работа с деньгами, но не банковское ПО).


        1. denisromanenko
          25.09.2019 16:47

          Нет не надо


        1. sevmax
          26.09.2019 07:07

          ShadowOfClown
          Kubernetes — это не серебряная пуля в инфраструктуре. Кривая обучения очень крутая и надо иметь достаточный опыт, чтобы использовать его в production. Kube тянет за собой смену всего стека: способ развёртывания серверов, обновление самого k8s, деплой приложений, pipeline для создания и поддерживание контейнеров в актуальном состоянии и тому подобное. Это может быть следующей ступенью развития вашей инфраструктуры.
          Начните использовать его в dev/staging environment, но не спешите переводить прод на него, пока не набьёте руку и не получите достаточно опыта!


    1. therb1
      27.09.2019 19:47

      Самое странное что со стороны разработки все наоборот, сначала пилите монолит, а если клиент прошел то пилите на микросервисы до тех пор, пока до serverless не дойдет.


  1. Karl_Marx
    24.09.2019 22:39
    -1

    Я, честно говоря, не понимаю, зачем автор оригинальной статьи так суетится. AWS, контейнеры, балансировка нагрузки, Linux и все только для того, чтобы захостить несчастный .Net API на трех мелких инстансах для какой-то игрушки? Если бы он был чуть проще и взял три готовых Azure Cloud Services инстанса A1 v2, он уже получил бы экономию в 264$ в год, балансировку из коробки, винду, 2Гб оперативки вместо 1.75 и забыл бы о контейнерах как о страшном сне, просто заливал бы пакеты и не парился ни о каких докерах. А если реально хочется сэкономить, то может и облака не нужны? На 160 баксов в месяц он можно купить просто зверский VPS и кувыркаться там как душе угодно.


    1. vikarti
      25.09.2019 08:19

      Более менее автоматическое масштабирование? (а вдруг статью на хабре выложат и все пойдут смотреть что за игра, упс). Отсутствие единой точки отказа? Модные слова в резюме?


      1. Karl_Marx
        25.09.2019 12:07

        Ну, это недостатки только последнего варианта, единственный VPS действительно был бы немасштабируемым решением. Но с другой стороны, судя по количеству часов в счете, автомасштабированием он активно не пользуется. А с точки же зрения аптайма, самым слабым звеном тут является сам владелец сервиса :)