Как ограничить параллельное выполнение бессерверной лямбда-функции

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

Поэтому я хочу запускать только 5 лямбда-функций за раз и ставить в очередь другие события. Я знаю, что есть:

    provisionedConcurrency: 3 # optional, Count of provisioned lambda instances
    reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit

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

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

Мне интересно, поддерживается ли это понятие очереди событий в AWS?


comment
вы можете использовать sqs   -  person jellycsc    schedule 14.01.2021
comment
Я не думаю, что sqs - это решение этой проблемы. Здесь я пытаюсь ограничить количество параллельных запусков лямбда-функции.   -  person Exploring    schedule 14.01.2021
comment
Какие события запускают вашу лямбда-функцию?   -  person tsamaya    schedule 21.01.2021


Ответы (1)


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

AWS Lambda Concurrency

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

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

Правильный способ установить зарезервированный предел параллелизма в Serverless Framework - это тот, которым вы поделились:

functions:
  hello:
    handler: handler.hello # required, handler set in AWS Lambda
    reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit

Я бы посоветовал использовать SQS для управления вашей очередью. Одна из распространенных архитектурных причин использования очереди - ограничить нагрузку на другую часть вашей архитектуры. Это может означать предотвращение перегрузки базы данных или избежание ограничений скорости для стороннего API при обработке большого пакета сообщений.

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

В вашем случае у вас может быть функция hello, которая принимает ваши запросы и помещает их в очередь SQS. С другой стороны, функция compute получит эти сообщения SQS и вычислит их, ограничив количество одновременных вызовов до 5.

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

functions:
  hello:
    handler: handler.hello

  compute:
    handler: handler.compute
    reservedConcurrency: 5
    events:
      - sqs:
          arn: arn:aws:sqs:region:XXXXXX:myQueue
          batchSize: 10 # how many SQS messages can be included in a single Lambda invocation
          maximumBatchingWindow: 60 # maximum amount of time in seconds to gather records before invoking the function
person marco.santonocito    schedule 22.01.2021