Статьи

Расширение вашего технического стека с помощью AWS Lambdas

Давайте посмотрим правде в глаза. Отладить проблемы с производительностью сложно, но исправить их еще сложнее.

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

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

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

Бессерверные функции в веб-сервисах Amazon

В Amazon Web Services (или AWS) бесчисленные функции называются Lambdas. В то время как Lambdas и другие серверные функции дают нам преимущество выполнения кода на других машинах, существуют ограничительные условия, как мы можем это сделать.

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

Для Amazon это означает запуск и выполнение кода в среде Ubuntu (Linux). Существуют также определенные ограничения в отношении среды развертывания и выполнения AWS Lambda, о которых нам нужно подумать.

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

Память и ограничения по времени

Хотя в конечном итоге мы пытаемся делегировать работу AWS Lambdas, нам необходимо выполнить ее так, чтобы она соответствовала пределу использования памяти 128 МБ и пределу выполнения. Для выполнения каждой функции также требуется менее 300 секунд (пять минут).

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

С более модульной реализацией Lambda мы должны быть способны обрабатывать все, что нам нужно, в этих пределах.

Временное хранилище

Хранилище также немного интересно в AWS Lambdas. Мы также можем записать только 512 МБ в одной части файловой системы Lambda: /tmp .

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

Размер пакета развертывания

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

AWS Lambdas требует от нас извлечения каждой зависимости из нашего пакета развертывания. Поэтому мы должны убедиться, что сумма нашего кода и зависимостей соответствует этому пределу!

Языковые ограничения

Наконец, одним из самых больших ограничений является то, что в лямбде разрешено выполнение только определенных языков. Для AWS Lambdas этими языками являются (на момент написания) Python, Go, JavaScript и Java.

Если приложение написано на одном из этих языков, вам повезло! Все, что вам нужно сделать, это импортировать код, и все готово.

Однако я хочу рассказать, почему использование Lambdas все еще имеет смысл, даже если ваше приложение написано не на одном из этих языков.

Пример с Ruby и Python

Большая часть моей недавней работы была основана на Python-лямбде, называемом Ruby-приложением. Итак, я собираюсь продемонстрировать пример с использованием этих двух языков.

Python и Ruby являются динамическими языками . Хотя AWS не предлагает поддержку Ruby для Lambdas, они поддерживают Python. Написание Python-лямбды для Ruby-кода может иметь большой смысл, поскольку они похожи по стилю и структуре. У Amazon также есть замечательный Ruby SDK, который мы будем использовать для вызова и управления нашими Lambdas.

Давайте начнем с написания Python Lambda:

index.py

1
2
3
4
5
6
def handler(event, context):
  input_message = event.get('message')
  print(input_message)
  return {
    'message': 'Well, hey there Ruby application!'
  }

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

  • Регион AWS, где развернута лямбда
  • Ваш ключ доступа AWS и секретный ключ доступа
  • Название Лямбда

Имея эти данные в руках, мы можем начать писать приложение на Ruby. Прежде чем начать, не забудьте добавить AWS Ruby SDK в Gemfile вашего проекта.

app.rb

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
require ‘aws-sdk’
require 'json'
      
credentials = Aws::Credentials.new('access-key', 'access-key-secret')
      
lambda_client = Aws::Lambda::Client.new(
  region: 'lambda-aws-region',
  credentials: credentials
)
     
app_payload = {
  message: "Hello Python Lambda!"
}
      
response = lambda_client.invoke({
  function_name: "SampleAWSFunction",
  invocation_type: "RequestResponse",
  payload: app_payload
})
      
parsed_response = JSON.parse(resp.payload.string)
puts parsed_response

Имея это в виду, теперь мы можем запустить app.rb и получить живой ответ от нашей лямбды!

Завершение

В этом базовом примере у нас теперь есть возможность делегировать более сложный код на основе Ruby в функцию Lambda на любом языке, который поддерживает AWS.

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

Нужно создать что-то более производительное с потоками? Возможно, попробуйте использовать такой язык, как Java или Go для своей функции. Хотите остаться в чем-то похожем на Ruby? Придерживайтесь этого шаблона Python или попробуйте JavaScript!

Хотя выбор языка вне стека AWS и запуск собственного решения определенно привлекательны во многих отношениях, стабильность, стоимость и эффективность использования AWS Lambdas — самые сильные коммерческие преимущества сервиса. Для меня только эти причины обеспечивают эффективные и экономичные средства, которые помогут вам лучше сбалансировать узкие места синхронного выполнения в ваших приложениях.

Еще одна вещь, которая мне показалась интересной в работе с AWS Lambdas, заключается в том, что у каждого есть свое уникальное решение и реализация их использования.

Каждая архитектура требует времени, проб и ошибок для разработки. Если все сделано правильно, инвестиции и разочарование очень сильно окупаются при решении вопросов, связанных со скоростью и временем выполнения приложения.

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

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

Посмотрите оригинальную статью здесь: Расширение вашего технического стека с помощью AWS Lambdas

Мнения, высказанные участниками Java Code Geeks, являются их собственными.