Amazon web services 将AWS Lambda配置为Dynamodb流的并行计算
我在Amazon web services 将AWS Lambda配置为Dynamodb流的并行计算,amazon-web-services,aws-lambda,amazon-dynamodb,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我在EC2和python3.6awslambda体系结构上有一个flask。当响应到达flask时,新项目被添加到dynamoDB,这将触发Lambda,该过程将使用新添加的项目启动一些过程。出于某种奇怪的原因,它不并行处理触发器,为每个触发器启动新的lambda函数,而是逐个处理它们 我尝试将并发限制设置为最大值,但没有成功 我需要尽快得到结果,不要自己管理任何缩放过程。所以触发器需要并行处理,而不是像现在这样逐个处理 如果使用Python开发Lambda函数,默认情况下不会出现并行性。Lam
EC2
和python3.6
awslambda
体系结构上有一个flask
。当响应到达flask
时,新项目被添加到dynamoDB
,这将触发Lambda
,该过程将使用新添加的项目启动一些过程。出于某种奇怪的原因,它不并行处理触发器,为每个触发器启动新的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
希望这有帮助
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
希望这有帮助。在dynamodb中,并行lambda的数量由您正在写入的碎片数量控制 Amazon DynamoDB、AWS Lambda轮询您的流并调用Lambda函数。 当Lambda函数被限制时,Lambda会尝试处理 阻止批记录,直到数据过期。 这段时间内,亚马逊动情最长可达七天。 被阻止的请求被视为按碎片阻塞,并且 Lambda直到 限制的记录批过期或成功。 如果流中有多个碎片, Lambda继续在非节流碎片上调用,直到一个碎片通过 这样做是为了控制
事件按照在dynamodb上执行的顺序进行处理。但碎片的数量不是由您直接控制的
现在你能做的最好的事情就是
在lambda函数中。通过这样做,您将在同一lambda中接收多个事件。您可以在lambda函数中使用并行性来同时处理所有这些函数。但这将有明显的缺点,比如如果您不能在lambda超时之前处理所有这些问题。您必须确保代码是线程安全的
在dynamodb中,并行lambda的数量由您正在写入的碎片数量控制
Amazon DynamoDB、AWS Lambda轮询您的流并调用Lambda函数。
当Lambda函数被限制时,Lambda会尝试处理
阻止批记录,直到数据过期。
这段时间内,亚马逊动情最长可达七天。
被阻止的请求被视为按碎片阻塞,并且
Lambda直到
限制的记录批过期或成功。
如果流中有多个碎片,
Lambda继续在非节流碎片上调用,直到一个碎片通过
这样做是为了控制事件按照在dynamodb上执行的顺序进行处理。但碎片的数量不是由您直接控制的
现在你能做的最好的事情就是
在lambda函数中。通过这样做,您将在同一lambda中接收多个事件。您可以在lambda函数中使用并行性来同时处理所有这些函数。但这将有明显的缺点,比如如果您不能在lambda超时之前处理所有这些问题。您必须确保代码是线程安全的
在这种情况下,写入DynamoDB可能会阻塞并行性
用于快速且可扩展的项目处理的替代体系结构:将项目作为文件添加到S3存储桶中。然后S3铲斗上的触发器将启动Lambda。新建文件-新建Lambda,这样,只有Lambda并发才能限制并行的Lambda数量。在这种情况下,写入DynamoDB可能会阻止并行
用于快速且可扩展的项目处理的替代体系结构:将项目作为文件添加到S3存储桶中。然后S3铲斗上的触发器将启动Lambda。新建文件-新建Lambda,这样,只有Lambda并发才能限制并行的Lambda数量。您的数据在dynamodb中是如何分布的?看起来像是切分问题。您的数据在dynamodb中是如何分布的?看起来像是切分问题。谢谢你的回答!那么,解决方案是在一个lambda上启动多个进程?那么如何将所有新触发器实时添加到多处理中?@DenysMelnychenko是的,您可以在一个lambda上启动多个进程。为实时数据添加触发器的最佳方法是使用AWS Kinesis服务。当在kinesis流中发现新记录时,将调用lambda函数。感谢您的回答!那么,解决方案是在一个lambda上启动多个进程?那么如何将所有新触发器实时添加到多处理中?@DenysMelnychenko是的,您可以在一个lambda上启动多个进程。为实时数据添加触发器的最佳方法是使用AWS Kinesis服务。A.