如何扩展 DynamoDB 记录处理?



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

该架构的工作方式如下:

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

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

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

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

我怎样才能构建系统,以便在 60 秒<处理所有文档?>

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

构建它以使这项工作的一种方法是对 cron 项目进行分区,以便您可以并行调用多个 lambda(即扇出工作)而不是只有一个 (lambda A),以便每个 lambda 处理一个分区(或一组分区)而不是整个事情。

如何实现此目的取决于当前主键的外观以及您希望如何查询这些项目。这是一个解决方案:

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"类型),每个 lambda 处理一个前缀集。或者你可以说 5 个 lambda,每个 lambda 处理 20 个前缀的范围。您甚至可以根据负载动态扩展和缩减 lambda 调用的数量,而无需更新表中数据中的前缀。

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

编辑

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

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

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

在 Amazon DynamoDB 中创建新的预置表时,您必须 指定其预置的吞吐容量。这是 表可以支持的读取和写入活动。DynamoDB 使用此 信息,以保留足够的系统资源以满足您的需求 吞吐量要求。

您可以改为创建按需模式表,这样您就不会 以管理服务器、存储或吞吐量的任何容量设置。 DynamoDB 可在工作负载增加或减少时立即适应工作负载 到任何以前达到的流量级别。如果工作负载的流量级别 达到新的高峰,DynamoDB 可快速适应工作负载。 欲了解更多信息

您可以选择允许DynamoDB 自动扩展来管理表的 吞吐能力。但是,您仍然必须提供初始设置 创建表时的读取和写入容量。DynamoDB Auto 缩放使用这些初始设置作为起点,然后 动态调整它们以响应应用程序的 要求

随着应用程序数据和访问要求的变化,您可能会 需要调整表的吞吐量设置。如果您正在使用 DynamoDB 自动扩展,吞吐量设置自动 根据实际工作负载进行调整。您还可以使用 用于手动调整表吞吐量的更新表操作 能力。如果需要大容量加载数据,您可能会决定这样做 从现有数据存储到新的 DynamoDB 表中。你可以 创建具有较大写入吞吐量设置的表,然后减少 批量数据加载完成后的此设置。

您可以根据容量单位指定吞吐量要求 - 应用程序每秒需要读取或写入的数据量。你 如果需要,可以稍后修改这些设置,或启用 DynamoDB 自动 缩放以自动修改它们。

我希望这可以帮助您的疑问。

最新更新