Параметры Lambda с низкой задержкой - PullRequest
1 голос
/ 15 марта 2020

У меня есть лямбда, которая требует отправки сообщений другой лямбде для выполнения какого-либо действия. В моем конкретном случае он передает сообщение в Lambda для выполнения HTTP-запросов и обновления sh записей кэша.

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

Это дополнительно усложняется, если мне нужно сделать несколько вызовов SQS для отправки вызовов Это особенно плохо, поскольку Lambda отвечает за ответы на HTTP-запросы с низкой задержкой.

Есть ли в AWS какие-либо альтернативы для связи между Lambdas, для которых не требуется синхронный вызов API и которые демонстрируют больше огня и забыть и асинхронного поведения?

Ответы [ 3 ]

2 голосов
/ 15 марта 2020

Хотя существует несколько подходов для запуска одной лямбды из другой, (по моему опыту) одним из самых быстрых методов будет прямой запуск ARN конечной лямбды.

Вы пробовали вызывать одну лямбду из другой, используя AWS SDK?
(например, в Python с использованием Boto3, я добился этого следующим образом).

См. Ниже, параметр InvocationType = 'Event' помогает в асинхронном вызове целевой лямбды.

Ниже код принимает 2 параметра (name, которые могут быть либо именем вашей целевой лямбда-функции, либо ее ARN, params является объектом JSON с входными параметрами, которые вы хотели бы передать в качестве ввода). Попробуйте!

import boto3, json


def invoke_lambda(name, params):

    lambda_client = boto3.client('lambda')

    params_bytes = json.dumps(params).encode()
    try:
        response = lambda_client.invoke(FunctionName = name,
                                        InvocationType = 'Event',
                                        LogType = 'Tail',
                                        Payload = params_bytes)
    except ClientError as e:
        print(e)
        return None

    return response

Надеюсь, это поможет!

Подробнее см. Событие Lambda Invoke в документации по Boto3.

В качестве альтернативы, вы также можете использовать Asyn Lambda c Invoke .

1 голос
/ 15 марта 2020

Трудно дать точные ответы, не зная, на каком языке вы пишете функцию Lambda. Чтобы хотя бы ускорить «теплые» вызовы функций, я хотел бы убедиться, что вы создаете клиент SQS вне обработчика событий Lambda, чтобы он мог повторно использовать соединение. AWS SDK должен использовать пул HTTP-соединений, поэтому ему не нужно переустанавливать sh соединение и go через SSL-рукопожатие и все это каждый раз, когда вы делаете запрос SQS, если вы повторно используете клиент SQS.

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

0 голосов
/ 15 марта 2020

Вы также можете попробовать использовать Lambda Destination в зависимости от вашего варианта использования. При этом вам не нужно ставить вещи в очередь вручную.

https://aws.amazon.com/blogs/compute/introducing-aws-lambda-destinations/

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

...