如何使用一个lambda函数(a)的n个结果来调用Python中另一个lambda处理器函数(B)的n个并发实例?

如何使用一个lambda函数(a)的n个结果来调用Python中另一个lambda处理器函数(B)的n个并发实例?,python,concurrency,aws-lambda,invoke,Python,Concurrency,Aws Lambda,Invoke,我有一个AWS Lambda函数(A),它返回n个URL。我希望将这些URL中的每一个作为参数单独和并发地传递到另一个AWS Lambda函数(B)。然后,函数B处理传递的url并返回结果。这两个函数都是用Python编写的,如果可能的话,我宁愿避免使用其他语言。是否有人有解决超时、并发冲突、其他边缘情况和/或错误的最终解决方案 即使分配了最大内存,函数A也需要约85秒来设置有效负载并调用函数B 1100次。调用另一个AWS Lambda函数通常是~80ms?有没有更快的办法?此外,功能B的Cl

我有一个AWS Lambda函数(A),它返回n个URL。我希望将这些URL中的每一个作为参数单独和并发地传递到另一个AWS Lambda函数(B)。然后,函数B处理传递的url并返回结果。这两个函数都是用Python编写的,如果可能的话,我宁愿避免使用其他语言。是否有人有解决超时、并发冲突、其他边缘情况和/或错误的最终解决方案

即使分配了最大内存,函数A也需要约85秒来设置有效负载并调用函数B 1100次。调用另一个AWS Lambda函数通常是~80ms?有没有更快的办法?此外,功能B的CloudWatch日志将多个日志流中的调用分开,因此很难在一个位置查看所有调用,以确认是否正确完成了操作和/或以何种顺序和/或任何错误/延迟可能位于何处

我已经看过了

我还利用和来访问现有代码

这是我用于测试的代码

# 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!')}
调用另一个AWS Lambda函数通常是~80ms

对我来说这听起来不是很糟糕,但可能还有一些改进的空间。在查看代码时,我突然想到的一件事是,您正在一次又一次地创建AWS Lambda客户端对象。尝试创建一次客户端,如下所示:

client = boto3.client('lambda')
for result in results:
        payload = {'url' : result}
        client.invoke(FunctionName='B', InvocationType='Event', Payload=json.dumps(payload))
通过重用同一个客户机对象,我认为您将看到性能的提高,这是由于重用了AWSAPI服务器的底层HTTP连接

此外,功能B的CloudWatch日志将 多个日志流之间的调用使得很难看到所有 在1个位置调用以确认事情是否正确完成和/或 错误/延迟的顺序和/或位置

您正在处理在多台服务器上运行的一千多个异步进程。在一个地方查看所有这些日志将是一个挑战。你可以考虑使用类似的方法

有没有人有解决超时问题的最终解决方案, 并发冲突、其他边缘情况和/或错误

管理超时、并发限制和其他错误的典型模式是将所有事件发送到一个SQS队列,然后重试。然而,虽然第一个Lambda函数的完成速度与现在一样快,或者可能更快

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

client = boto3.client('lambda')
for result in results:
        payload = {'url' : result}
        client.invoke(FunctionName='B', InvocationType='Event', Payload=json.dumps(payload))