Давайте посмотрим правде в глаза. Отладить проблемы с производительностью сложно, но исправить их еще сложнее.
Допустим, вы нашли нарушающий код, который замедляет работу вашего приложения. В конце концов наступает момент, когда вы обнаруживаете, что этот скачок кода является синхронным или линейно исполняемым. Один из наиболее эффективных способов исправить эти проблемные разделы кода — делегировать самые тяжелые рабочие нагрузки для обработки более позднему времени и месту.
Несмотря на то, что существует бесконечное количество решений для делегирования рабочей нагрузки, идея выполнения кода на сторонних серверах — также называемых бессерверными функциями — становится все более популярной в последние годы.
Бессерверные функции невероятно полезны, потому что мы можем настроить время и частоту выполнения этих рабочих нагрузок. Кроме того, мы платим только за время и вычислительную мощность, которые мы используем. Нет необходимости в постоянно работающем сервере, который потребляет расходы на хостинг, даже когда он не используется.
Бессерверные функции в веб-сервисах 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, являются их собственными. |