如何使用lambda函数(a)的n结果来调用python中另一个lambda处理器函数(b)的同一实例



我具有返回n url的AWS lambda函数(a(。我想单独和同时将这些URL作为参数传递到另一个AWS lambda函数(b(。函数B然后处理传递的URL并返回结果。这两个功能都是用Python编写的,如果可能的话,我希望避免其他语言。是否有人有一个确定的解决方案,可以说明超时,违规,其他边缘案件和/或错误?

即使分配了最大内存,功能A也需要〜85秒即可设置有效载荷和调用功能B 1,100次。大约80ms调用另一个AWS lambda功能吗?有更快的方法吗?此外,函数b的CloudWatch日志在多个日志流中分开调用,因此很难在1个位置看到所有调用以确认是否正确完成和/或以什么顺序和/或任何错误/延迟的位置。

我已经查看了boto3.client('lambda'(docs

我还利用boto来调用lambda函数,我该如何异步?和AWS lambda:使用boto3调用来自另一个AWS lambda的呼叫函数以获取我的现有代码。

这是我用于测试的代码。

# Function A - using max Memory setting (3008 MB currently) to speed things up
import boto3
import json
def lambda_handler(event, context):
    #simulate 1,100 urls (more than the default concurrency limit of 1,000)
    n = 1100
    results = range(1, n+1)
    #invoke function B asynchronously
    for result in results:
        payload = {'url' : result}
        boto3.client('lambda').invoke(FunctionName='B', InvocationType='Event', Payload=json.dumps(payload))
    return{'statusCode': 200, 'body': json.dumps('Hello from Lambda!')}
# Function B - using the min Memory setting (128 MB currently)
import json
import time
def lambda_handler(event, context):
    #wait 5 seconds to simulate processing time
    time.sleep(5)
    #process passed payload from function A
    print(event['url'])
    return{'statusCode': 200, 'body': json.dumps('Bye from Lambda!')}

〜80ms是调用另一个AWS lambda函数的典型特征吗?

听起来对我来说并不是很不好,但是可能会有一些改进的余地。查看您的代码时会跳出我的一件事是,您正在一遍又一遍地创建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服务器的基础连接的重复使用。

此外,函数b的CloudWatch日志分开 多个日志流中的调用使得很难看到所有 1个地方的召唤以确认是否正确完成和/或 以什么顺序和/或可能找到任何错误/延迟的位置。

您正在处理在多个服务器上运行的一千多个异步过程。在一个地方查看所有这些日志将是一个挑战。您可能会考虑使用CloudWatch Logs Insights之类的东西。

任何人都有一个确定的解决方案,可以说明超时, 并发违规,其他边缘案件和/或错误?

管理超时,并发限制和其他错误的典型模式是将所有事件发送到SQS队列,并让队列触发您的第二个Lambda功能。但是,虽然您的第一个lambda功能将与现在一样快地完成,或者可能更快,

可以用来解决其中一些问题的另一种模式是在您的第一个lambda函数中实现指数向后算法。但是,这需要您的函数代码才能直接处理重试,而不是依靠其他AWS服务(例如SQS(来处理重试,并且需要在lambda功能中添加暂停,这可能会导致第一个功能调用最终在此之前超时成功触发了所有第二个功能调用,这只是创建了另一个错误条件,您必须以某种方式处理。

最新更新