如何扩展 DynamoDB 记录处理?

How to scale DynamoDB record processing?

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

架构是这样的:

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

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

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

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

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

我不确定您的项目,但看起来您所问的内容已经在 AWS DynamoDb Documentation 中,请阅读此处:

When you create a new provisioned table in Amazon DynamoDB, you must specify its provisioned throughput capacity. This is the amount of read and write activity that the table can support. DynamoDB uses this information to reserve sufficient system resources to meet your throughput requirements.

You can create an on-demand mode table instead so that you don't have to manage any capacity settings for servers, storage, or throughput. DynamoDB instantly accommodates your workloads as they ramp up or down to any previously reached traffic level. If a workload’s traffic level hits a new peak, DynamoDB adapts rapidly to accommodate the workload. For more information

You can optionally allow DynamoDB auto scaling to manage your table's throughput capacity. However, you still must provide initial settings for read and write capacity when you create the table. DynamoDB auto scaling uses these initial settings as a starting point, and then adjusts them dynamically in response to your application's requirements

As your application data and access requirements change, you might need to adjust your table's throughput settings. If you're using DynamoDB auto scaling, the throughput settings are automatically adjusted in response to actual workloads. You can also use the UpdateTable operation to manually adjust your table's throughput capacity. You might decide to do this if you need to bulk-load data from an existing data store into your new DynamoDB table. You could create the table with a large write throughput setting and then reduce this setting after the bulk data load is complete.

You specify throughput requirements in terms of capacity units—the amount of data your application needs to read or write per second. You can modify these settings later, if needed, or enable DynamoDB auto scaling to modify them automatically.

希望对你的疑惑有所帮助

你是对的,Lambda A 将不得不做一个无法扩展的怪物 scan/query。

构建它以使其工作的一种方法是对您的 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),因此您可以让不同的 lambda 表达式基于该前缀并行查询不同的项目集。

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

中数据的前缀

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

编辑

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

你仍然需要注意 运行 时间(并捕获错误以重试,因为这不是原子的)但是如果你像上面那样展开你的 lambda 将处理 运行 时间足够广泛地传播它。