Подробное руководство по использованию AWS Lambda с gRPC Protobufs.

В этой статье объясняется, как использовать AWS Lambda с gRPC Protobufs. Перед тем, как углубиться в детали реализации, вот краткое описание AWS Lambda и gRPC.

AWS Lambda. Lambda также известна как функция как услуга (FAAS) или просто «бессерверная». Этот сервис AWS позволяет пользователям определять последовательность вычислений как функцию. Lambda экономит много времени для разработчиков, так как им нужно написать только основную логику, а обо всем остальном позаботится облачный провайдер. Эта логика будет автоматически выполняться всякий раз, когда происходит событие триггера.

gRPC — реализация протокола RPC от Google. В отличие от традиционного RPC (удаленный вызов процедур), gRPC не зависит от языка. Чтобы добиться независимости от языка, gRPC использует протокольные буферы или Protobuf. Protobufs заботится о переводе данных в типы данных, зависящие от языка программирования. Кроме того, gRPC в несколько раз быстрее, чем REST API. Важной причиной является то, что gRPC не приходится иметь дело с упаковкой и синтаксическим анализом JSON во время связи, что позволяет избежать значительных накладных расходов, особенно в настройках микросервисной архитектуры.

Можно ли запустить функцию Lambda с помощью gRPC?

На абстрактном уровне функции gRPC и Lambda являются «удаленными методами». Конечный пользователь/Клиент пытается вызвать метод, определенный на удаленном компьютере. Но есть различия в том, как вызываются gRPC и Lambda. Чтобы углубиться в этот вопрос, важно понять внутренности gRPC и Lambda.

Реализация gRPC представляет собой архитектуру клиент-сервер. Если компьютер-B хочет выполнить метод на компьютере A, здесь gRPC-Client(Computer-B) запрашивает gRPC-Server(Computer-A) через HTTP/2 для выполнения удаленного метода. Таким образом, сервер всегда будет работать в ожидании запросов от клиентов для обслуживания.

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

В то время как для gRPC требуется активный сервер, Lambda — это бессерверная функция. Можно сделать Lambda клиентом gRPC, но не сервером gRPC. Таким образом, на момент написания этой статьи по умолчанию невозможно вызвать функцию Lambda с использованием gRPC.

Обходные пути

Основная проблема здесь заключалась в том, чтобы справиться с различиями в дизайне. Для gRPC требуется сервер, в то время как Lambda предназначена для работы без сервера.

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

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

Другие люди также пытались объединить gRPC и Lambda, и прямого способа добиться этого не существует. Эта статья из блога Coinbase хорошо документирована и рассказывает о различных подходах, которые они пытались достичь. Я пропускаю свои неудачные попытки, так как сама статья Coinbase очень обширна.

Что, если мы напишем код сервера gRPC на Lambda, но убедимся, что он запускается только при запуске события и выключает его после завершения выполнения.

Сочетание преимуществ gRPC и Lambda:

Главное преимущество gRPC — Protobuffs. Protobuffs обеспечивают gRPC независимость от языка, поэтому клиент и сервер могут быть написаны на разных языках программирования, но при этом они могут взаимодействовать друг с другом. Protobuf обеспечивают внутреннее представление методов и типов данных. Он действует как переводчик и помогает переводить различные типы данных между языками программирования.

Что, если мы воспользуемся этими Protobuf для связи с функцией Lambda. У него нет практического применения, но с ним просто интересно поэкспериментировать! Так что вперед с этим подходом.

Дизайн реализации:

Клиент:

Мой клиент построен на Scala.

  1. Получить ввод от пользователя
  2. Подтвердите ввод. В случае неудачи предложите пользователю ввести данные еще раз.
  3. Создайте объект сообщения Protobuf, используя пользовательские входные данные.
  4. Преобразуйте объект в строку, затем закодируйте в байты и отправьте его на конечную точку AWS Lambda API Gateway.
  5. Отобразите ответ от Lambda пользователю.

Лямбда-сервер:

  1. Настройте конечную точку шлюза API в качестве триггерной функции вызова Lambda.
  2. При вызове читать тело запроса от клиента.
  3. Декодируйте закодированное тело запроса и используйте полученную строку для воссоздания объекта сообщения Protobuf.
  4. Используя информацию из объекта сообщения Protobuf, выполните вычисление и верните результат клиенту.

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

Пример исходного кода:

Найдите репозиторий GitHub для проекта, который я создал для вызова функции Lambda с помощью gRPC. Клиент запрашивает метку времени, и Lambda проверяет файлы журналов на наличие журналов для этой метки времени.



Больше чтений:

  • Как написать и развернуть AWS Lambda Function (скоро будет опубликовано)
  • Как установить библиотеки, зависящие от Python, в AWS Lambda Environment (скоро будет опубликовано)
  • Начало работы с gRPC в Scala

Вот оно. Спасибо за чтение.

Если вам нравятся статьи, у вас есть комментарии или отзывы, напишите письмо по адресу [email protected] или свяжитесь со мной в LinkedIn.

Подпишитесь на мою среду и подпишитесь на мою электронную рассылку, чтобы получать больше статей, подобных этой!

Статья изначально опубликована в: Laxmena Blog

Найди меня на







Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.