Serverless
Что такое Serverless?
Это такой способ хостинга, при котором у разработчика нет контроля за серверами. Вместо этого программа загружается напрямую в serverless платформу, и уже она берет на себя всё остальное.
Получается что-то типа цифрового коммунизма: каждому по потребностям, с каждого по затратам. Программы на Serverless платформах автоматически масштабируются, при резком наплыве запроосов получая дополнительные мощности, а платить приходится только за непосредственно потраченные ресурсы. Кроме того, у провайдеров зачастую есть бесплатные тарифы, что делает их привлекательным вариантом для маленьких хобби-проектов.
Обычно serverless-провайдеры не разрешают держать код постоянно запущенным. Вместо этого взаимодействие с программой обычно строится на базе отдельных запросов. Чаще всего это обычные HTTP-запросы, но можно встретить возможность запуска кода по таймеру или по MQTT.
Как работает Serverless?
Serverless-платформы можно поделить на два типа:
Первый тип, традиционный, работает на базе контейнеров или виртуальных машин. Для пользовательского кода выделяется один или несколько инстансов с выделенными ресурсами (обычно около 128MB оперативки и какая-нибудь доля ядра в каждом). Если запросов приходит слишком много, поднимаются дополнительные инстансы. Если запросов приходит слишком мало, лишние инстансы убиваются. Разработчик платит за общее время жизни инстансов.
Так работают AWS Lambda, GCP, Heroku и ещё много других.
Второй же, появившийся совсем недавно, вместо изоляции операционной системы целиком, изолирует только javascript-песочницу внутри V8. Таким образом, масштабирование происходит быстрее (на запуск кода с нуля уходит 5-30мс вместо 200-500мс), а ресурсы можно распределять более оптимально (чаще всего деньги берут только за количество обработанных запросов, а на сами запросы ставят только лимит в несколько десятков миллисекунд чистого процессорного времени, без учёта io-bound задач).
Так работают Cloudflare Workers и Deno Deploy.
Отмечу, что эти провайдеры поддерживают только браузерный javascript (CF Workers) или Deno (Deno Deploy). Nodejs не подходит для такого из-за своей внутренней реализации (видимо, слишком слабая изоляция).
Мой опыт
Я попробовал много разных serverless-платформ (табличку со сравнением которых мы с сообществом grammY пытаемся вести тут). Некоторые мне понравились, а некоторые — не очень. Рассматривал я их больше с точки зрения бесплатного хостинга для хобби-проектов, хотя для средненагруженных проектов должно быть тоже очень интересно.
Самая большая проблема — это долговременное хранение данных. У serverless инстансов нет традиционной файловой системы, поэтому даже хранение сессий в телеграм-ботах становится проблемой. У некоторых провайдеров есть свои решения (например, Deta Base), но не у всех. grammY предоставляет своё бесплатное хранилище (на базе S3), но оно подходит только для прототипов, потому что производительность у него очень слабая.
Зато если бот или веб-сервер не имеют собственного состояния, serverless показывает себя крайне хорошо. Например, я за несколько минут переписал @gmojibot на Deno (благо grammY его поддерживает) и захостил на Deno Deploy. Работает просто замечательно.
Что мне не понравилось
А не понравились мне решения от Scaleway: Serverless Functions и Serverless Containers. А я надеялся, что Serverless Containers будут вести себя как обычные VPS-ки, только скейлиться при необходимости и оплачиваться по использованным ресурсам. А оказались обычными "традиционными" serverless решениями с долгими холодными стартами, не очень понятными ценовыми политиками и без доступа к файловой системе. Монгу в таком не захостишь, а так хотелось.