Python Amazon Lambda是否适合每天并行计算数百份报告?

Python Amazon Lambda是否适合每天并行计算数百份报告?,python,amazon-web-services,amazon-s3,amazon-ec2,aws-lambda,Python,Amazon Web Services,Amazon S3,Amazon Ec2,Aws Lambda,我目前的处境: 我目前有一个Python脚本,它通过HTTP端点获取数据,每天计算并生成成百上千的报告。目前,它在AWS EC2实例上运行,在该实例中,队列用于在四个线程之间拆分它需要生成的报告。脚本一次四个,获取数据,计算每个报告,并将其保存到PostgreSQL数据库中 问题: 随着项目的扩展,我的脚本将无法足够快地计算,也无法使用当前方法在一天内生成所需的所有报告 寻找解决方案: 我偶然发现了Amazon Lambda,但我还没有发现有人将其用于类似于我的用例。我的计划是将需要生成的每个报

我目前的处境:

我目前有一个Python脚本,它通过HTTP端点获取数据,每天计算并生成成百上千的报告。目前,它在AWS EC2实例上运行,在该实例中,队列用于在四个线程之间拆分它需要生成的报告。脚本一次四个,获取数据,计算每个报告,并将其保存到PostgreSQL数据库中

问题:

随着项目的扩展,我的脚本将无法足够快地计算,也无法使用当前方法在一天内生成所需的所有报告

寻找解决方案:

我偶然发现了Amazon Lambda,但我还没有发现有人将其用于类似于我的用例。我的计划是将需要生成的每个报告上传/放入自己的S3存储桶中,然后在创建存储桶时触发Lambda函数。Lambda函数将执行所有数据获取(从HTTP端点)和所有计算,并将其保存到我的PostgreSQL Amazon RDS中的一行。从理论上讲,这将使所有内容都是并行的,并且消除了等待释放资源的队列的需要

基本上,我正在寻找一个解决方案,以确保我的脚本能够每天运行并完成每一天,而不会过度运行到第二天

我的问题:

Amazon Lambda是否适合这样的产品

使用AmazonLambda(每天创建成百上千个s3存储桶)执行类似操作是否成本高昂

有更好的选择吗

非常感谢您提供的任何帮助、建议、见解或提示。谢谢

Amazon Lambda是否适合这样的产品

  • 您的跑步时间不能超过5分钟
  • 部署(特别是当您有许多外部库时)有点笨重
  • 您几乎无法控制AWS如何运行代码(可能会出现延迟或暂停,日志很难获取)
如果这些问题对你来说不是很严重,我认为你的问题听起来很合适

使用AmazonLambda(每天创建成百上千个s3存储桶)执行类似操作是否成本高昂

请参阅和

每天创建数千个桶听起来是个坏主意(AWS可能不允许这样做)。默认情况下,您的帐户中可以有100个bucket,并且每个bucket名称都是全局的(对于该区域)。也许你是说一个桶里有几千把钥匙

这一切都取决于您报告的大小、创建报告所需的时间和内存,以及从AWS获取报告的频率(即您支付数据传输费用的时间)。AWS有一个问题,尽管这有点痛苦,所以你可能更愿意自己从他们的定价页面中找到答案

有更好的选择吗


如果您的报告几乎是不断生成的,那么您最好还是自己继续运行服务器。如果您偶尔会获得非常大的批量,那么最好是现场竞标实例或寻找其他云服务提供商。如果你一整天都有不规则的爆发,那么Lambda似乎非常适合你。

@Nathaniel已经回答了大部分问题,但我想补充一点“其他选择”:

如果从源代码的角度来看,您可以并行运行比四个报告更多的报告(您只是因为CPU利用率而将它们限制为四个,而不是因为HTTP服务无法处理更高的负载),那么我肯定可以说您可以做更多的事情:

  • 重写要使用的报告,以便可以利用HTTP请求被阻止时的时间。这可以增加您的吞吐量

  • 获取具有更多CPU的实例,并使用更多线程运行脚本。对于您正在执行的任务,我想说您至少可以使用CPU*4个线程运行,可能会更多—监控CPU利用率并增加线程数,直到您实现良好的用户CPU利用率

  • 执行自群集-将脚本放在实例启动时运行,并在没有完成任何工作时杀死实例,创建一些使用现货价格的脚本,并观察它们执行工作

  • 如果您不介意切换语言,您可以使用显式集群和基于消息的调度,比如Akka或Storm

  • 介绍了一种使用Lambda并行处理S3中大量文件的体系结构。原型级别的实现在Node.js中,但架构不依赖于语言。此解决方案假定您可以分发处理

    总结如下:

  • 其想法是运行一台接收报告请求的EC2机器。这台机器在S3中创建一个源文件列表(在您的情况下可能是http端点),并将其分发给Lambda函数的第一级
  • 每个函数都将任务分配给叶级工作函数
  • 所有结果都聚合回EC2机器,EC2机器将结果实时流式传输给用户(在您的情况下可能是RDS) 您的用例不同,但本文展示了一种在很短时间内并行运行大量分析任务的简单方法


    提供的原型实现缺少生产中所需的几个明显特性,因此只能用于演示。另外,请看一看作者在评论中链接的出色的“重新发明”演示文稿。

    还有1.5MB的内存限制,必须提前分配,分配的越多,无论您是否需要,成本就越高。我知道我的一些生成xlsx文件的报告实际上需要更多的内存来渲染。哦+1对于spot实例——这似乎是一个理想的用例。谢谢,这是我一直在寻找的洞察力!我的报告几乎一直在生成,所以我认为您是对的,我最好还是自己继续运行服务器。我想