首页 > 解决方案 > 如何扩展 DynamoDB 记录处理?

问题描述

我正在使用 DynamoDB 和 Lambda 构建基于 Web 的 CRON 服务。虽然我目前没有以下问题,但我很好奇如果出现问题我该如何解决。

该架构的工作原理如下:

  1. Lambda A - 查询当前分钟内应该发生的所有任务
  2. Lambda A - 对于每个任务,在文档上增加一个计数器
  3. Lambda B - 监听每个文档的流事件并运行实际的 CRON 任务

据我所知,Lambda B 应该是可扩展的——AWS 应该运行尽可能多的实例来处理所有的流事件(我认为)。

但是对于 Lambda A,假设我每分钟需要处理 10 亿个文档。

当我查询每分钟的任务时,Lambda 需要发出多个请求才能获取和更新所有文档。

我如何构建系统以便在 60 秒内处理所有文档?

标签: aws-lambdaamazon-dynamodbscaling

解决方案


没错,Lambda A 必须进行无法扩展的怪物扫描/查询。

构建此功能以使其工作的一种方法是对您的 cron 项目进行分区,以便您可以并行调用多个 lambda(即,将工作扇出)而不是仅调用一个(lambda A),以便每个处理一个分区(或设置分区)而不是整个事情。

您如何实现这一点取决于您当前的主键是什么样的,以及您希望如何查询这些项目。这是一个解决方案:

cronID | rangeKey               | jobInfo | counter
1001   | 72_2020-05-05T13:58:00 | foo     | 4
1002   | 99_2020-05-05T14:05:00 | bar     | 42
1003   | 01_2020-05-05T14:05:00 | baz     | 0
1004   | 13_2020-05-05T14:10:00 | blah    | 2
1005   | 42_2020-05-05T13:25:00 | 42      | 99

我在 rangeKey 中添加了一个随机前缀 (00-99),因此您可以让不同的 lambdas 根据该前缀并行查询不同的项目集。

在此示例中,您可以每分钟调用 100 个 lambda(“Lambda A”类型),每个处理一个前缀集。或者你可以说 5 个 lambda,每个处理 20 个前缀。您甚至可以根据负载动态地上下缩放 lambda 调用的数量,而无需更新表中数据的前缀。

由于这些 lambda 基本相同,您可以只调用 lambda A 所需的次数,为每个注入适当的前缀作为配置。

编辑

LastEvaluatedKey重新评论中的 1MB 页面限制,如果您的查询受到限制,您会得到回复。您的 lambda 可以在循环中执行查询,将LastEvaluatedKey值传回,ExclusiveStartKey直到您获得所有结果页面。

您仍然需要注意运行时间(并捕获错误以重试,因为这不是原子的)但是如果您足够广泛地扇动它,如上所述扇形您的 lambda 将处理运行时间。


推荐阅读