API Node.js на AWS – плюсы и минусы Express против Serverless

1656637331 api nodejs na aws – plyusy i minusy express protiv

Уильям Вудхед

Недавно я играл с Serverless + AWS lambda и, должен сказать, был поражен.

В последние несколько лет я почти исключительно использовал Express и AWS EC2 (и недавно Docker) для создания JavaScript REST API.

В этом материале описаны преимущества и недостатки Express и Serverless и объяснено, почему для нашей команды Pilcro целесообразно было перейти на другой. Эта часть предназначена для технических команд, желающих развертывать и управлять API Node.js на AWS (или подобных).

CxXXE330wof5O5qpQa2L0rh7AAzRduCQJbRt
Несколько агрессивный коллаж из их логотипов. Извинения.

TL; DR

Переход от Express к Serverless полностью изменил нашу доставку за последние 6 месяцев.

Плюсы: пониженная стоимость | масштабируемость и мониторинг готового развертывания молниеносное развитие.

минусы: потеря контроля загадочная среда выполнения Lambda молодая экосистема нет готового развертывания без простоев

Что такое Express | Что такое Serverless?

Express — это пакет Node.js, который, по сути, является хорошо разработанной абстракцией над родным модулем http(s) Node.js.

С другой стороны, без сервера это набор инструментов, взаимодействующих с облачными платформами, такими как AWS или GCP, для развертывания и управления API.

Из этих описаний мы видим, что Express и Serverless действительно очень разные — возможно, слишком разные, чтобы их сравнивать. Однако причина I утра их сравнение состоит в том, что как Express, так и Serverless можно использовать для написания API Node.js. Итак, перейдем к некоторым сравнениям:

Индексный файл

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

В Express ваш индексный файл является кодом JavaScript. Это действительно внятный декларативный файл. В бессерверном режиме это конфигурация yml, я боюсь.

Вот экспресс Привет Мир файл index.js:

const express = require('express');const handler = require('./handler');
const app = express();app.get('/hello-world', handler.helloWorld);app.listen(3000, () => console.log('Listening on port 3000'));

Вот бессерверный Привет Мир файл index.yml:

service: hello-worldprovider:    name: aws    runtime: nodejs6.10functions:  helloWorld:    handler: handler.helloWorld    events:      - http:        path: hello-world        method: get

На самом деле очень похоже, но лично мне нравится подход на основе промежуточного ПО Express. Для меня это легче для чтения и легче тестировать и отлаживать.

Кривая учеба

Это сложная тема, поскольку она зависит от того, чего вы пытаетесь достичь.

  • Если вы любитель Node.js и хотите научиться настраивать локальный сервер на своем компьютере, Express для вас. Это отличный пакет для экспериментов, документация для начала работы на веб-сайте отличная, и вы можете легко начать играть с тонкостями архитектуры на основе событий Node.js.
  • Если вы пытаетесь развернуть и управлять надежными, масштабируемыми API Node.js, кривая обучения безусловно легче с бессерверным. Это связано с тем, что без сервера напрямую решается много ваших сложных облачных проблем. К ним относятся развертывание, мониторинг и обеспечение инфраструктуры, чтобы назвать некоторые.

Операции – развертывание, масштабирование, журналирование, мониторинг…

bJdnwDUal7mdHyigzm81e-f0nuD3CC0-usJE
Винтики для представления операций очевидно.

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

Для развертывания и масштабирования можно использовать Docker, Kubernetes, Elastic Beanstalk или некоторые другие службы AWS.

Для журналирования, мониторинга и обработки ошибок можно использовать New Relic, Datadog, Pingdom и т.д.

Вы поняли идею. Express – отличный инструмент низкого уровня для создания API, но вам нужно изучить кучу других пакетов для вашего API, чтобы процветать в современном облачном мире. Это отлично, если вы хотите настроить собственные архитектуры и иметь полный контроль.

Благодаря Serverless вы получаете столько всего готового. Не из пакета Serverless, а потому, что Serverless может автоматически взаимодействовать со всеми службами вашей облачной платформы. Например, просто с Привет Мир пример index.yml, который мы видели выше, вы получите по умолчанию:

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

Пожалуйста, обратите внимание: сейчас с бессерверным развертыванием мы не достигаем нулевого простоя. Я считаю, что этого можно достичь с помощью AWS CodeDeploy, но пока мы просто позволяем API не работать на секунду или около того.

Стоимость

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

Запуск одной машины T2-Medium EC2 Linux на AWS стоит около 33 долларов в месяц. Мы использовали три из этих машин, прежде чем перейти на бессерверный режим.

Благодаря Serverless+AWS Lambda вы получаете 1 миллион запросов бесплатно ежемесячно.

В Pilcro мы еще не достигли этого уровня, поэтому мы сэкономили более ста долларов в месяц. Без серверов и Lambda теперь мы можем запускать наши API бесплатно.

Среда выполнения AWS Lambda

NKpXucW4pWZyIhbcklwDRHL8RUzTVVBJxZBz
Логотип AWS Lambda

Одним из недостатков использования без сервера является то, что функции API запускаются в среде выполнения AWS Lambda. Это означает, что вы никогда не будете полностью уверены, что происходит.

Вам также придется иметь дело с определенными странностями функции AWS Lambda, например фанк событие и контекст объекты, которые вводятся в ваши обработчики:

function awsLambdaHandler(event, context, callback) {  ...}
function expressHandler(req, res, next) {  ...}

Мне больше нравится req, res, следующий шаблон промежуточного программного обеспечения Express. Мне это кажется более логичным и понятным.

Еще одна блажь состоит в том, что для запуска ваших обработчиков AWS Lambda их нужно скачать в контекст выполнения. Это может занять некоторое время. Функции некоторое время кэшируются в контексте выполнения, поэтому часто первый запрос к Lambda занимает больше времени, чем последующие запросы. Это может вызвать раздражение, если ваш API используется редко.

Дополнительное примечание: Одним из замечательных преимуществ среды выполнения AWS Node.js Lambda является то, что в них установлен двоичный файл ImageMagick. Вы можете манипулировать изображениями в своих функциях Lambda из коробки!

Вывод

Это не совсем сравнение между Express и Serverless. Это подтверждение того, что в погоне за надежными, масштабируемыми облачными API такие пакеты, как Serverless, предлагают столько готовых возможностей, что продолжение использования Express (вместе с другими инструментами) выглядит как много тяжелой работы и обучения.

У Pilcro наши API достаточно просты и стандартны. Они состоят из обычных запросов REST и нескольких сложных функций обработки изображений.

Поскольку наши API очень просты, решение использовать бессерверный и лямбда было простым – нашими основными драйверами были стоимость, масштабируемостьи быстрота развития.

Стоимость потому что… стоимость.

Масштабируемость поскольку мы созданы на основе G-Suite, нам нужна была возможность чрезвычайно быстрого и эффективного масштабирования.

Скорость развития потому что нам нужно было доставить Pilcro в течение 6 месяцев с небольшой технической командой.

Бессерверный режим предоставил нам эти три преимущества, полностью изменивших нашу работу за последние 6 месяцев. Экосистема Serverless еще молода, так что в течение следующих 12 месяцев в этом пространстве, вероятно, будет много разработок.

Шаги, которые помогут вам решить, использовать ли без сервера

  1. Насколько сложны ваши API? Вам нужна низкоуровневая конфигурация и близость, которую вы получаете от использования Express?
  2. Как вы сейчас управляете развертыванием, масштабированием и мониторингом? Вы довольны своим решением? Как быстро новопринятый разработчик может изучить все разные части вашей архитектуры?
  3. Могли бы вы сэкономить деньги, перейдя на бессерверный режим?

Если вам понравилась эта история, пожалуйста? и поделитесь пожалуйста с другими. Также посмотрите мою компанию pilcro.com. Pilcro – это фирменное программное обеспечение для G-Suite – для маркетологов и бренд-агентств.

Добавить комментарий

Ваш адрес email не будет опубликован.