amazon-web-services - 在 AWS Lambda 中处理事件之前,是否有一种惯用的方法来聚合事件?
问题描述
我有一个处理来自 S3 的事件的 AWS Lambda 函数。我想在处理之前聚合它们并让 lambda 处理批处理。
理想情况下,我希望能够指定批处理大小和超时(比如说一个偶数,然后 5 秒内什么都没有,我想发送一个 1 事件批处理)。
有没有使用 Lambda 或其他 AWS 服务的惯用方法?
解决方案
您可以做几件事:
1.让上游做聚合:
让发布者负责发布,并让发布者为每组要处理的对象提供一个事件。如果发布者已经在批量工作,这很有效。
2. 插入您自己的聚合步骤:
- 触发每个事件。
- 将事件存储在某处。
- 如果存储了足够多的事件,则清空存储并将所有内容传递给处理步骤。
如果您的每个事件的处理步骤比仅处理事件要昂贵得多,则此方法效果很好。通常,这可以采用 {aggregating lambda} -> {processing batch job} 的形式,因为 Lambda 不适用于非常昂贵的处理。
3. 按时间进行聚合:
- 将您的事件发送到 SQS 队列。
- 触发计时器(例如Cloudwatch 事件)。
- 触发时,清空队列并处理其中的所有内容。如果在单个调用中处理太多,请立即触发额外的 lambda。
如果处理成本相当低,并且您希望最大限度地减少 Lambda 调用次数,则此方法效果很好。触发计划(您在两次调用之间等待多长时间)是通过权衡您愿意等待多长时间来处理一个事件与您愿意支付多少次调用来确定的。需要注意的事情:1. 如果您根本没有收到任何事件,您仍然会调用您的 Lambda,并且 2. 如果您收到的事件比处理它们的速度更快,您的队列将越来越多,您的处理将下降越来越落后。
推荐阅读
- java - iterator.next() 的线程安全
- c# - c#中异步方法中特定代码的同步保持
- python - 上一个键到当前键
- tcp - 无法使用 Arduino ESP8266 或兼容板连接到 LocalIP 或 Localhost (127.0.0.1)
- c# - 如何从表中选择通用列但确保我的 keycolumn 也被选中?
- sql - 如何在 PostgreSQL 中使用 ILIKE 运算符在文本中搜索“%”(百分号)
- c++ - 堆栈上没有默认构造函数的对象数组?
- javascript - 在反应本机应用程序中读取邮递员返回的错误消息
- reactjs - 反应测试错误“无法读取未定义的获取属性”
- node-red - 动态设置节点属性