Почему эта функция Lambda не выполняет больше одновременных вычислений?

У меня есть функция AWS Lambda, подключенная к потоку данных AWS Kinesis. Объем данных в потоке в последнее время значительно увеличился, но количество одновременных выполнений функции Lambda не увеличилось. «Параллельные выполнения» всегда колеблются в пределах 2-3, хотя вы можете видеть, что итератор имеет довольно много записей, ожидающих обработки в очереди: (https://i.sstatic.net/wdBhSgY8.png)

Я пробовал настроить эту функцию Lambda/поток Kinesis с 4 сегментами Kinesis + 10 параллельными выполнениями на каждый сегмент и даже попробовал 10 подготовленных параллельных вычислений в Lambda. Тем не менее, он никогда не проходит дальше трех одновременных исполнений.

В документации AWS здесь говорится: «Например, если вы установите для ParallelizationFactor значение 2, вы можете иметь максимум 200 одновременных вызовов Lambda для обработки 100 фрагментов данных Kinesis (хотя на практике вы можете увидеть разные значения для метрики ConcurrentExecutions)». Почему «на практике» мы можем видеть разные значения для одновременного выполнения? Почему мои застряли на 2-3?

Я уверен, что просто не понимаю какой-то базовой концепции Lambda, но нигде не могу найти хорошего объяснения. Какая переменная заставляет Lambda запускать больше одновременных выполнения? Как я могу заставить мою Lambda-функцию выполнять больше одновременных вызовов?

Подробности о моей функции Lambda и потоке Kinesis:

Лямбда-функция — это функция Python 3.9.

(https://i.sstatic.net/zOiRUoq5.png)

(https://i.sstatic.net/bmO5z6cU.png)

(https://i.sstatic.net/Yub4Vjx7.png)

(https://i.sstatic.net/ZfI7N4mS.png)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря дальнейшим исследованиям мне удалось определить, что ограничивающей переменной для количества сегментов Kinesis и одновременных выполнения Lambda является количество ключей разделов в моем потоке Kinesis.

Все записи с одинаковым ключом раздела всегда будут относиться к одному и тому же сегменту Kinesis. Таким образом, даже если у вас 100 шардов, если в ваших записях есть 1 ключ раздела, вы всегда будете использовать только 1 шард. Даже если ваши данные превышают емкость этого сегмента, Kinesis не будет использовать другой сегмент.

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

Таким образом, учитывая, что все записи для одного ключа раздела попадают в один и тот же сегмент Kinesis и что Lambda никогда не будет одновременно выполнять несколько пакетов одного и того же ключа раздела, мы можем задаться вопросом: почему в Lambda существует настройка «параллельных выполнения на каждый сегмент»? ? Ответ заключается в том, что несколько разных ключей разделов могут относиться к одному сегменту Kinesis. Например, вы можете иметь 3 разных ключа раздела во входящих данных, и если объем данных достаточно мал (например, менее 1000 МБ/сек), то все записи со всеми 3 этими ключами раздела могут перейти в тот же осколок Кинезиса. Затем, поскольку Lambda может обрабатывать разные ключи разделов одновременно, она будет запускать 3 одновременных пакета для одного сегмента (по одному для каждого ключа раздела в этом сегменте).

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

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

Ключ раздела сообщает Kinesis/Lambda: «Каждая запись с этим ключом раздела представляет собой уникальную очередь событий; пожалуйста, держите эти записи в порядке, записывая их в один и тот же сегмент Kinesis и никогда не запуская их одновременно в Lambda». Если вам нужна параллельная обработка и несколько сегментов, укажите отдельный ключ раздела для каждой очереди событий.

Следующие ответы, объединенные вместе, предоставили необходимую информацию для ответа на мой вопрос:

Что такое ключ раздела в AWS Kinesis?

Фактор распараллеливания: потоки данных AWS Kinesis в Lambda

Другие вопросы по теме