Типично ~ 80 мс для вызова другой лямбда-функции AWS?
Это не очень плохо для меня, но, возможно, есть место для улучшения.Одна вещь, которая бросается в глаза при взгляде на ваш код, это то, что вы снова и снова создаете клиентский объект AWS Lambda.Попробуйте создать клиент один раз, например так:
client = boto3.client('lambda')
for result in results:
payload = {'url' : result}
client.invoke(FunctionName='B', InvocationType='Event', Payload=json.dumps(payload))
Повторное использование того же объекта клиента, я думаю, вы увидите улучшение производительности из-за повторного использования основного HTTP-соединения с сервером AWS API.
Кроме того, журналы CloudWatch для функции B разделяют вызовы между несколькими потоками журналов, затрудняя просмотр всех вызовов в 1 месте, чтобы подтвердить, что все сделано правильно и / или в каком порядке и / или где-либоошибки / задержки могут быть обнаружены.
Вы имеете дело с более чем тысячей асинхронных процессов, запущенных на нескольких серверах.Просмотр всех этих журналов в одном месте будет сложной задачей.Возможно, вы захотите использовать что-то вроде CloudWatch Logs Insights .
Есть ли у кого-нибудь окончательное решение, которое учитывает тайм-ауты, нарушения параллелизма, другие пограничные случаи и / или ошибки?
Типичным шаблоном управления таймаутами, ограничениями параллелизма и другими ошибками может быть отправка всех событий в очередь SQS, а позволяет очереди запускать вторую функцию Lambda .Однако, в то время как ваша первая лямбда-функция завершит работу так же быстро, как сейчас, или, возможно, быстрее,
Еще одним шаблоном, который можно использовать для решения некоторых из этих проблем, будет реализация алгоритма экспоненциального отката . в вашей первой лямбда-функции.Однако для этого потребуется, чтобы код вашей функции обрабатывал повторные попытки напрямую, вместо этого полагаясь на другие службы AWS, такие как SQS, для обработки повторных попыток для вас, и для этого потребовалось бы добавить паузы в вашей функции Lambda, что потенциально может привести к тому, что первый вызов функции в конечном итоге прервется по таймауту до ее завершения.успешно запустил все вторые вызовы функций, которые просто создают еще одно условие ошибки, с которым вам придется как-то справиться.