【发布时间】:2021-12-02 05:28:29
【问题描述】:
所以我们有几个 lambdas 来监听 db 上的变化,在每个 lambda 中我们必须在开始时进行过滤,因为这个特定的 lambda 不关心所有变化,只关心一个特定的变化。
更明确地说,我们正在应用事件源,而 lambdas 应该是事件处理程序。我希望 lambda A 仅在事件 A 插入数据库时触发,而不是在插入事件时触发!对于 lambda B 和事件 B 等也是如此。
目前我们在每个 lambda 的开头都有一个过滤器:
lambdaA handler:
const eventsToBeProcessed = events.filter(
(event) => event.eventName === 'EventA'
);
既然我们有一堆很好的 lambda,当我只需要触发一个时触发所有它们是没有意义的!
我对 AWS 不是很有经验,但我假设解决方案是:
- 能够过滤 DynamoDb 触发器
- 不是让 lambdas 由 dynamodb 触发,而是在其间有一个 AWS 服务,每次更改都会触发它,它会根据更新内容知道要触发哪个 lambdas
编辑:
我对我标记为答案的解决方案不是很满意,主要原因是设计中的单点故障,而且它需要依靠 SNS 来进行发布/订阅,并且 SNS 不高如果您尝试拥有高可用性系统(4 个 9 左右),它可能会失败
我最终适应的解决方案(至少现在)是,当我将我的事件推送到事件存储中时,如果我想触发副作用,我只需将其推送到 AWS 的 EventBridge(一个带有规则)。 EventBridge 最好的部分是你可以设置你想要的规则,你想要的总线,然后(例如)当总线有事件 A 时调用 Lambda A 等等。
【问题讨论】:
-
你不能这样做。而是将所有内容流式传输到单个 lambda,然后 lambda 会将事件分发到不同的 lambda 函数。可以使用 sns/sqs 将第一个 lambda 与其他 lambda 解耦。
-
@Marcin 是的,这是我的预期,这就是我在第二个解决方案中的意思,不确定它应该是单个 lambda 还是其他 AWS 服务
-
遗憾的是,这是唯一的选择。您可以考虑是直接从第一个 lambdas 调用其他 lambdas,还是在其他 lambdas 处理它们之前将 db 事件放入 sqs 或 sns。
-
您可以使用 aws api 调用其他 lambda。如果您的函数在 python 中,您将使用 boto3 的 invoke 方法。您可以异步调用它们(即调用而不等待任何返回值)。无需 api 网关即可工作。您只需向第一个 lambda 的执行角色添加权限,就可以调用其他函数。
-
我主要使用 ts 但是我很确定有一个类似的 boto3 。是的,我显然不想为此使用 api 网关!感谢您的帮助:D
标签: amazon-web-services aws-lambda amazon-dynamodb event-sourcing