将AWS Lambda配置为Dynamodb流的并行计算

时间:2019-03-28 09:58:20

标签: amazon-web-services aws-lambda amazon-dynamodb

我在flaskEC2 python 3.6架构上拥有AWS Lambda。当对flask的响应到来时,新项目将添加到dynamoDB中,这将触发Lambda,该过程开始于新添加项目的处理。由于某些奇怪的原因,它不会并行处理触发器,而是为每个触发器启动新的lambda函数,而是一个接一个地处理它们。

我尝试将concurrency限制设置为最大值,但这没有用。

我需要尽快获得结果,并且不要自己管理任何扩展过程。因此,需要并行处理触发器,而不是像现在这样一一处理。

3 个答案:

答案 0 :(得分:0)

  1. 如果您使用Python开发Lambda函数,则默认情况下不会启用并行性。 Lambda支持Python 2.7和Python 3.6,它们都具有多处理和线程模块。
  2. 另一方面,您可以使用multiprocessing.Pipe而不是multiprocessing.Queue来完成所需的任务,而在执行Lambda函数的过程中不会出现任何错误。

有关并行执行源代码的更多详细信息,请参见下面的链接:

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继续调用未限制的碎片,直到通过为止。

source

这样做是为了控制the events are processed in order是在dynamodb上完成的。但是分片的数量不受您直接控制。

现在您能做的最好的事情就是

  1. set a higher Batch size在lambda函数中。这样,您将在同一lambda中收到多个事件。您可以在lambda函数中具有并行性,以将它们全部一起处理。但这会带来明显的缺点,例如如果您无法在lambda超时之前处理所有这些缺点,该怎么办。您将必须确保代码是线程安全的。

答案 2 :(得分:0)

在这种情况下,可能写入DynamoDB会阻止并行性。

用于项目的快速和可扩展处理的替代体系结构:将项目作为文件添加到S3存储桶。然后在S3存储桶上触发将启动Lambda。新文件-新的Lambda,这样,只有Lambda并发性会限制您并行拥有的lambda数。