【问题标题】:Recurring task processing 80k tasks stored in DynamoDB every 30 minutes重复任务每 30 分钟处理 8 万个存储在 DynamoDB 中的任务
【发布时间】:2020-04-14 07:00:17
【问题描述】:

我一直在寻找实现重复任务的方法,以处理存储在 dynamoDB 中的大量项目。在网上做了一些研究之后,其中一个选项涉及使用 CloudWatch Events 每 30 分钟触发一次事件,然后该事件触发 lambda A,然后 lambda 读取所有项目,将它们发布到 SQS 并让 lambda B 的多个实例从SQS 并并行处理它们。 (处理大约需要 200 毫秒)

但问题是 lambda 有 15 分钟的限制,并且一次从 DynamoDB 读取所有 80k 任务似乎不可行。

有人能就如何做到这一点提供建议吗?

【问题讨论】:

  • 是全状态处理吗?如果是无状态的,你应该有多个 lambdas 来构建你的处理逻辑。

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


【解决方案1】:

如果 AWS Lambda 函数运行时间过长,您可以改为使用用户数据启动脚本启动 Amazon EC2 实例来执行类似的功能。完成任务后,它可以自行终止。 (设置Startup Behavior = Terminate,然后向操作系统发出关闭命令。)

但是,您说此任务需要每 30 分钟完成一次,但 Lambda 函数可能需要超过 15 分钟才能将所有内容推送到 SQS。这可能证明始终只运行一个小型 EC2 实例是合理的,而不是每 30 分钟启动一个 Lambda 函数。 EC2 实例可以使用 cron 作业来触发活动。定价类似(~1c/小时)。

另一个瓶颈可能是每 30 分钟读取 8 万个项目,这会导致 DynamoDB 的访问模式出现峰值。 (每 30 分钟短时间大量使用)。这可能需要过度配置读取容量以确保它能够满足需求。

【讨论】:

  • 感谢您提出的解决方案! (我肯定会考虑到这一点。)我还在研究利用 DynamoDB TTL 来过期(和删除)一个项目,该项目会发出一个由 SQS 消耗的事件。这个实现的问题是,根据表的大小,可能会有长达 48 小时的延迟。基于此analysis 似乎有 100k 个项目,最大延迟约为 27 分钟。
【解决方案2】:

@john-rotenstein 分享了一个长期工作的解决方案,我个人会选择它作为接受的一个:-)
我的回答将是对您的问题状态进行一个小的重构。

如果每 30 分钟触发一次 Lambda,由于任务量大而导致 Lambda 执行时间过长,则减少单个 Lambda 的负载。
例如:

  1. 更频繁地触发 Lambda(例如每分钟)。
  2. 使用小批量任务触发多个 Lambda。

顺便说一下,我假设您从 DynamoDB 中批量读取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2018-03-26
    • 2013-02-18
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多