У меня 200 файлов jsonl (json-lines) в ведре s3. Каждый файл содержит 100 000 JSON для записи в DynamoDB.
Я хочу использовать Lambda для загрузки файла из S3 и пакетной записи его в DynamoDB (файлы уже полностью соответствуют схеме таблицы).
У меня 200 файлов, но я не могу одновременно вызывать 200 лямбда-выражений - поскольку DynamoDB ограничен всего 10 000 WCU в секунду, я могу писать только 10 000 строк в секунду. А лямбда-выражения могут длиться всего 300 секунд до истечения времени ожидания.
Как лучше всего это сделать?
В настоящее время я думал асинхронно вызывать сразу 5 лямбда-выражений и отслеживать файлы журналов, чтобы увидеть, сколько из них выполнено, вызывая следующий только после завершения одного?
ИЛИ...
Могу я установить ограничение одновременного выполнения до 5 для лямбда-функции, а затем асихорно вызывать функцию 200 раз (по одному для каждого файла)? Будет ли AWS автоматически запускать следующую лямбду, когда она будет завершена?
Из Документов Amazon:
https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html
Устанавливая ограничение параллелизма для функции, Lambda гарантирует, что выделение будет применено конкретно к этой функции, независимо от объема обработки трафика оставшимися функциями. Если этот предел превышен, функция будет ограничена. Поведение этой функции при дросселировании будет зависеть от источника события. Для получения дополнительной информации см. Поведение при регулировании.
Затем из документов aws, касающихся поведения регулирования: https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html#throttling-behavior
При достижении предела параллелизма, связанного с функцией, любые дальнейшие запросы на вызов этой функции регулируются, то есть вызов не выполняет вашу функцию. Каждый регулируемый вызов увеличивает показатель Amazon CloudWatch Throttles для функции. AWS Lambda обрабатывает регулируемые запросы вызова по-разному в зависимости от их источника:
Синхронный вызов: если функция вызывается синхронно и регулируется, Lambda возвращает ошибку 429, а вызывающая служба отвечает за повторные попытки. Код ошибки ThrottledReason объясняет, столкнулись ли вы с ограничением на уровне функции (если указано) или с ограничением на уровне учетной записи (см. Примечание ниже). У каждой службы может быть своя собственная политика повтора. Например, CloudWatch Logs повторяет неудачный пакет до пяти раз с задержками между попытками. Список источников событий и их тип вызова см. В разделе Поддерживаемые источники событий.
Асинхронный вызов: если ваша функция Lambda вызывается асинхронно и регулируется, AWS Lambda автоматически повторяет регулируемое событие в течение шести часов с задержками между попытками. Помните, что асинхронные события ставятся в очередь до того, как они будут использоваться для вызова функции Lambda.
Таким образом, кажется, что если вы установите ограничение на количество одновременных операций (по умолчанию для всех ваших функций установлено значение 1000), то AWS либо выдаст вам код состояния 429 (для запроса-ответа), либо автоматически поставит в очередь и попытается повторить вашу функцию до 6 часов.
Однако он не указывает, как работает функция задержки между повторными попытками.