我在flask
和EC2
python 3.6
架构上拥有AWS Lambda
。当对flask
的响应到来时,新项目将添加到dynamoDB
中,这将触发Lambda
,该过程开始于新添加项目的处理。由于某些奇怪的原因,它不会并行处理触发器,而是为每个触发器启动新的lambda函数,而是一个接一个地处理它们。
我尝试将concurrency
限制设置为最大值,但这没有用。
我需要尽快获得结果,并且不要自己管理任何扩展过程。因此,需要并行处理触发器,而不是像现在这样一一处理。
答案 0 :(得分:0)
有关并行执行源代码的更多详细信息,请参见下面的链接:
https://aws.amazon.com/blogs/compute/parallel-processing-in-python-with-aws-lambda/
此外,您可以参考以下代码:
import time
import multiprocessing
region_maps = {
"eu-west-1": {
"dynamodb":"dynamodb.eu-west-1.amazonaws.com"
},
"us-east-1": {
"dynamodb":"dynamodb.us-east-1.amazonaws.com"
},
"us-east-2": {
"dynamodb": "dynamodb.us-east-2.amazonaws.com"
}
}
def multiprocessing_func(region):
time.sleep(1)
endpoint = region_maps[region]['dynamodb']
print('endpoint for {} is {}'.format(region, endpoint))
def lambda_handler(event, context):
starttime = time.time()
processes = []
regions = ['us-east-1', 'us-east-2', 'eu-west-1']
for region in regions:
p = multiprocessing.Process(target=multiprocessing_func, args=(region,))
processes.append(p)
p.start()
for process in processes:
process.join()
output = 'That took {} seconds'.format(time.time() - starttime)
print(output)
return output
希望这会有所帮助。
答案 1 :(得分:0)
并行lambda的数量由您要写入的dynamodb中的分片数量控制。
Amazon DynamoDB,AWS Lambda轮询您的流并调用您的Lambda函数。 当您限制Lambda函数时,Lambda尝试处理 节制的记录批处理,直到数据过期为止。 对于Amazon Kinesis,此时间段最长为7天。 被限制的请求被视为每个分片阻塞,并且 Lambda不会从分片读取任何新记录,直到 节制的记录批将过期或成功。 如果信息流中有多个分片, Lambda继续调用未限制的碎片,直到通过为止。
这样做是为了控制the events are processed in order
是在dynamodb上完成的。但是分片的数量不受您直接控制。
现在您能做的最好的事情就是
Batch size
在lambda函数中。这样,您将在同一lambda中收到多个事件。您可以在lambda函数中具有并行性,以将它们全部一起处理。但这会带来明显的缺点,例如如果您无法在lambda超时之前处理所有这些缺点,该怎么办。您将必须确保代码是线程安全的。答案 2 :(得分:0)
在这种情况下,可能写入DynamoDB会阻止并行性。
用于项目的快速和可扩展处理的替代体系结构:将项目作为文件添加到S3存储桶。然后在S3存储桶上触发将启动Lambda。新文件-新的Lambda,这样,只有Lambda并发性会限制您并行拥有的lambda数。