【发布时间】:2021-03-26 10:37:47
【问题描述】:
这是我正在尝试制作的简化方案:
http 请求 --> (Gateway API + lambda A) --> SQS --> (lambda B ?????) --> DynamoDB
所以它应该如下所示工作:来自许多 http 请求的数据(例如,每秒最多 500 个) 由我的 lambda 函数 A 放入 SQS 队列。然后另一个函数 B 处理队列: 最多读取 10 个项目(定期)并使用 BatchWriteItem 将它们写入 DynamoDB。
问题是我不知道如何触发第二个 lambda 函数。它应该被频繁地调用,每秒多次(或至少每秒一次),因为我需要队列中的所有数据尽快进入 DynamoDB(这就是为什么通过预定事件调用 lambda 函数 B 描述 here 不是一个选项)
我为什么不想直接写入 DynamoDB,而不使用 SQS?
完全避免使用 SQS 对我来说很好。我试图用 SQS 解决的问题是 DynamoDB 节流。甚至不限制自身,而是使用 AWS SDK 将数据写入 DynamoDB 时的处理方式:当一条一条写入记录并限制它们时,AWS SDK 会静默地重试写入,从而导致从 http 客户端的请求处理时间增加查看。
所以我想暂时将数据存储在队列中,将响应“200 OK”发送回客户端,然后通过单独的函数处理队列, 使用一个 DynamoDB 的 BatchWriteItem 调用写入多条记录(其中 返回未处理的项目,而不是在节流的情况下自动重试)。 我什至宁愿丢失一些记录,而不是增加接收记录和存储在 DynamoDB 中的记录之间的延迟
UPD:如果有人感兴趣,我已经找到了如何让 aws-sdk 在节流时跳过自动重试:有一个特殊参数 maxRetries。无论如何,按照下面的建议使用 Kinesis
【问题讨论】:
-
什么原因无法解决 - 依靠 Number 计划的事件源?
-
也许我遗漏了一些东西,但从我在docs 中看到的最小调度速率为 5 分钟。但我需要能够每秒运行我的函数。我对所有这些东西完全陌生,所以请指教。
-
了解 5 分钟的延迟。如果是这种情况,那么您必须使用在 EC2 中运行的自定义进程/脚本,它将 SQS 中的项目连接到 DynamoDB。我也在考虑 AWS Data Pipeline,它的 schedule 选项接受值为 1 的文本框和 min 的组合作为时间频率。
-
是的,EC2 中的自定义进程而不是 lambda 函数将解决所有问题,这将是我最后的后备选项。
-
我之前也尝试过在 Lambda 中完成这类事情。我放弃。 SQS 与 Lambda 的任何集成目前都感觉像是一个巨大的黑客攻击。我现在只有一个在 t2.nano 实例上运行的服务,它不断地轮询 SQS。希望亚马逊将来会在 SQS 和 Lambda 之间添加某种形式的集成。如果您不反对在 AWS 之外寻找,您可以查看 IronIO,它具有 IronMQ/IronWorker 集成,看起来与我希望 AWS 的集成类似。
标签: amazon-web-services aws-lambda amazon-sqs