aws-lambda - 如何扩展 DynamoDB 记录处理?
问题描述
我正在使用 DynamoDB 和 Lambda 构建基于 Web 的 CRON 服务。虽然我目前没有以下问题,但我很好奇如果出现问题我该如何解决。
该架构的工作原理如下:
- Lambda A - 查询当前分钟内应该发生的所有任务
- Lambda A - 对于每个任务,在文档上增加一个计数器
- Lambda B - 监听每个文档的流事件并运行实际的 CRON 任务
据我所知,Lambda B 应该是可扩展的——AWS 应该运行尽可能多的实例来处理所有的流事件(我认为)。
但是对于 Lambda A,假设我每分钟需要处理 10 亿个文档。
当我查询每分钟的任务时,Lambda 需要发出多个请求才能获取和更新所有文档。
我如何构建系统以便在 60 秒内处理所有文档?
解决方案
没错,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 将处理运行时间。
推荐阅读
- dns - Cloudflare CNAME 转到默认网页 cgi
- c++ - 读取一整行字符串并用空格分隔它们
- masstransit - Masstransit Sagas - 事件未发布
- javascript - Vuetify 分页数据表
- c# - 在 dotnet core web API 中使用现有 JSON 动态创建新 JSON 模型
- c++ - 检查先决条件应该是谁的责任?
- xamarin.forms - ItemsSource 更改时选择器未更新
- python - Python将文本文件中的数据加载到sqlite数据库中,并将表名和列作为参数传递
- mysql - MySQL LIMIT 在相关子查询中被忽略
- javascript - 是否引用了 JavaScript 闭包变量,或者它们是否包含自己的副本?