Рубрики
Uncategorized

Почему мы переехали из лямбда в ECS

После многих месяцев развития моя команда только что объявила общую доступность нашей платформы. … Помечено с AWS, DEVOPS, Serverless, Облако.

После многих месяцев развития моя команда только что объявила общую доступность нашей платформы. Эта веха кажется идеальной возможностью оглядываться назад и отражать на том, как инфраструктура, которая поддерживает призматику, развивалась со временем. (Спойлер: Мы закончили перемещать наше самое важное микросервис от лямбда в ECS.)

В этом посте я погрузимся в то, что прошло хорошо в лямбде, какие вызовы мы столкнулись, и почему мы в конечном итоге приняли решение мигрировать некоторые услуги из лямбда в AWS упругая контейнер (ECS).

Какие проблемы мы решаем?

Для некоторого быстрого контекста наш продукт представляет собой интеграционную платформу для компаний по программному обеспечению B2B. То есть мы помогаем программным компаниям создавать интеграции и развернуть эти интеграции своим клиентам. Простая интеграция может выглядеть что-то подобное:

  • Шаг 1: Снимите документ XML из Dropbox.
  • Шаг 2: Процесс XML с помощью какого-то пользовательского кода JavaScript.
  • Шаг 3: Используйте несколько хранимых учетных данных для публикации обработанных данных в сторонние API.

Наши пользователи могут настроить интеграции для запуска по расписанию, или они могут вызвать их через веб -ook, и наша платформа заботится о запуске, журналах и мониторинге интеграции (и целую кучу других вещей).

Первые дни

Первое воплощение призматической используемой LocalStack Отказ Мы знали, что мы хотели в конечном итоге призматизировать призматику в AWS (с возможностью перемещения в Azure, GCP и т. Д. При необходимости), поэтому способность раскручивать нашу платформу локально для моделирования AWS, была привлекательной. Сервис LocalStack, который приближается к AWS Lambda, был легко повторен и пробежал без каких-либо основных икота. Это дало нам отличную петлю обратной связи в разработке, поэтому мы могли бы прототип и очень быстро тестировать.

Мы использовали лямбда, чтобы выполнить каждый «шаг» интеграции, а шаги используют SQS для передачи данных и запускают следующий шаг. Итак, исполнение интеграции будет выглядеть так:

  • Запустите Dropbox «Fetch файл», чтобы получить файл XML.
  • Сохраните содержимое этого XML-файла в SQS, вызвать следующий шаг.
  • Запустите пользовательский код JavaScript клиента для обработки XML.
  • Сохраните полученные преобразованные данные в SQS, вызвайте следующий шаг.
  • Запустите действие, чтобы опубликовать обработанные данные в сторонние API.
  • Сохраните результаты последнего шага, вызвать конец интеграции.

В пределах LocalStack это был очень быстрый процесс. Мы могли бы определить 6-ступенчатую интеграцию, запустить ее и увидеть результаты в течение нескольких секунд.

Наша миграция на настоящую aws lambda

Как только у нас будет доказательство работы концепции, мы предали некоторое время, чтобы двигаться призматично к фактической производственной среде, с настоящими лямбдами, очередями, базами данных и т. Д. Мы все еще была небольшая команда, и мы не хотели посвятить тонну времени, чтобы деформироваться-y, проблем с инфраструктурой еще. Мы хотели посвятить большую часть нашего времени на наш основной продукт, и лямбда давайте сделаем только это.

Лямбда был привлекательным для нас по ряду причин. Нам не нужно было беспокоиться о процессоре или распределении памяти, мониторинга сервера или автоскализация; Это все встроенно. Мы смогли бросить .zip файлы, полные код JavaScript на лямбда, и AWS позаботился о остальных. Лямбда. Давайте распределить наш код в серию микросервисов (услуга для регистрации, сервис для продления ключей ОАУУТ, услуга для SMS/оповещения по электронной почте, если ошибка интеграции и т. Д.), Чтобы мы могли держать хорошую ментальную карту того, что код отвечает за какую задачу. Стоимость была довольно разумной, тоже — вы просто платите за вычисление времени, поэтому, вместо того, чтобы запустить серверы 24/7, мы только что заплатили, когда наши прототипы что-то выполняли.

Через несколько дней обезьяна с Террафом У нас было наше второе воплощение призматической в AWS. Наши интеграционные бегуны побежали на настоящей лямбде и были вызваны через SQS. Это точка, в которой мы начали работать в вопросах производительности с нашими бегунами интеграции.

Почему лямбда не работает для нас

У нас было ряд вопросов, начиная от скорости до размера SQS и отсутствие процессов изоляции в лямбде, что заставило нас пересмотреть свою эффективность в качестве нашего бегуна интеграции. Давайте поговорим о каждом из этих вопросов:

Скорость. Помните 6-ступенчатую интеграцию, которую я сказал, занял пару секунд, чтобы бежать в LocalStack? Это заняло полную минуту, используя настоящую лямбду и aws. Фактические законодательства лямбда были быстрыми — обычно несколько миллисекунд. Написание пошаговых результатов к SQS и последующему исполнению следующего шага, хотя и заканчивалось несколько секунд каждый шаг. Для более сложных интеграций, таких как те, которые зацикливаются более 500 файлов, это было шоу-пробкой — кто хочет их интеграции, чтобы занять минуты (часы?)

Мы попробовали ряд вещей, чтобы получить наши лямбда, чтобы идти быстрее. Мы следили за руководствами, чтобы сохранить ряд лямбдейских экземпляров «теплым», и мы сорвались по количеству VCPUS PORMING нашего лямбдаса к самый высокий мы могли в то время (6 VCPUS/10GB RAM), но те вещи только побрили однозначные проценты от нашей интеграции.

Ограничения размера SQS Отказ SQS ограничивает размер сообщения к 256 килобайт Отказ Объем данных, передаваемых между этапами интеграции, часто превысил этот размер (в конце концов, это совершенно разумно для разработчика интеграции, чтобы понизить несколько файлов JSON Megabyte для обработки). Мы смогли работать вокруг этого ограничения размера — рекомендуемое решение, которое мы следили, заключалась в том, чтобы записать полезные нагрузки на S3 и передавать ссылки на объекты S3 через SQS — но этот дополнительный вызов API S3 только усугубил нашу отпущенную проблему.

Процесс изоляции Отказ Это был вопрос, который удивил меня больше всего. Сначала AWS LAMBDA кажется привлекательным в качестве автоматического вычисления без гражданства — запустить работу, выход, запустить другую работу и т. Д. — масштабировать горизонтально по мере необходимости. Мы наивно предположили, что законодательства лямбда были изолированы друг от друга, но это оказалось только наполовину. Одновременные вызовы изолированы (они работают в отдельных контейнерах в пределах лямбда). Однако последующие вызовы повторно используют предыдущие «теплые» среды, поэтому бегун интеграции может наследовать «грязную» среду из предыдущей интеграции. Это особенно проблема, если вы позволите клиентам написать свой собственный код, как мы сделаем для интеграции наших клиентов.

Оказывается, если один клиент пишет какой-то плохой код в их интеграцию — что-то вроде этого, Глобальный. Xmlhttprequest; Затем последующая интеграция работает на том же лямбде, которая зависит от XMLHTTPREQUEST ошибка библиотеки вне. Это большое дело, так как один клиент может сломать что-то вроде Axios для другого клиента. Клиент может даже быть злоумышленником и выполнять что-то вроде global.console.log = (Msg) = > {NefariousCode (); } и другие интеграции, которые выполняют на том же лямбде, будут работать NefariousCode () Всякий раз, когда они вызывают console.log () Отказ Ики!

Мы попробовали несколько вещей, чтобы обойти этот вопрос об общем выполнении. Мы играли с принуждением нашего лямбда в холодное начало каждый раз (что было ужасной идеей по очевидным причинам), и мы попробовали прямые отчетливые процессы узла в … хроперание тюрьмы . Ни одна опция не вышла — вращающиеся процессы дочерних узлов в лямбде заняли 3-5 секунд и частично победили цель быть в лямбде в первую очередь.

Наш переход в ECS

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

Наша команда должна была работать расширять наши существующие сценарии Terraporm и переместила нашу интеграционную бегунку в эластичный контейнер AWS (ECS). В рамках контейнера ECS мы могли бы легко (и быстро!) Chroot и изолировать процессы узла друг от друга, решение проблем изоляции процесса мы видели в лямбде. Чтобы продвинуться по размеру SQS, ограничивающиеся, мы столкнулись, мы поменялись в службу поддержки ODIS. Нам пришлось изобретать несколько колес, которые лямбда дал нам бесплатно — например, лесозаготовки, автоскализацию и проверки здоровья — но в конце концов у нас была наша 6-ступенчатая тестовая интеграция назад к запуску менее 2 секунд.

Теперь ECS не был идеальным — есть некоторые компромиссы. Для одного, ECS, похоже, не так быстро, как лямбда. «Масштабирование», похоже, займет около минуты или около того между вызовом API и AWS FARGATE Вытягивая и инициализация контейнера, который готов принять работу. Нам пришлось вытащить один из наших разработок продуктов для работы на облачную инфраструктуру, и есть тонна больше, чтобы жонглировать в отношении процессора и использование памяти, правила аутокалирования и мониторинга, но на данный момент в развитии продукта у вас есть боли Прирост, чтобы дать нашим клиентам скорейшего бегуна интеграции.

Что осталось в лямбде

Мы не двигали все наши наши микросервисы из лямбда — много еще остаются в безрусной экосистеме и будут в обозримом будущем. Наш бегун интеграции не подходил лямбда хорошо, но есть и другие задачи, для которых лямбда кажется четким выбором. Мы сохранили все важные услуги интеграции, которые не имеют решающее значение для фактического выполнения интеграции в лямбда. Те, кто включает в себя:

  • Служба регистратора, которая тянет журналы из ECS и отправляет их на Datadog Отказ
  • Служба, которая записывает метаданные об исполнения интеграции в базу данных PostgreSQL.
  • Сервис, который отслеживает и очереди запланированные интеграции.
  • Услуга оповещения, которая отправляет уведомления о SMS или по электронной почте для пользователей, если ошибка их интеграции.
  • Служба авторизации, которая обновляет клиентов ключей OAUTH 2.0 для сторонних услуг.

Мы не хотели ни одного из этих услуг блокировать выполнение интеграции, и для всех из них все в порядке, если они пройдут дополнительные секунды или два, так что услуги, как отлично подходят лямбда.

Заключение

Наша инфраструктура определенно изменилась со временем, но я думаю, что решения, которые мы сделали по пути, были подходящими: «ЛОКАЛЬНЫЙ ЛЖАЙБДА», «ЛАМБДА», давайте разрабатываем и повторимся очень быстро, и наше первое развертывание в AWS было достаточно просто, чтобы наша небольшая команда DEV может Террафор нашей инфраструктуры, не теряя тонну DEV часов к ней.

Лямбда казался привлекательным решением для хостинга и масштабирования наших микросервисов, и для многих из них, особенно асинхронных услуг, которые могут занимать секунду или два, чтобы пройти, он все еще остается правильным выбором. Однако для нашего бегуна интеграции мы узнали о том, что ограничения размера, скорости и процесса изоляции Lambda сделали ECS лучший вариант, и стоило разработки времени, которое было предпринято для создания развертывания ECS для этой конкретной услуги.

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

Оригинал: «https://dev.to/prismatic/why-we-moved-from-lambda-to-ecs-4m96»