微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据多个 (1k-10k) 计划触发 AWS Lambda 函数

如何解决根据多个 (1k-10k) 计划触发 AWS Lambda 函数

我们有一个 AWS Lambda 函数,它从我们的数据库中为客户查询一些数据,并向客户发送报告。有些客户需要每日报告,有些客户可能需要每周或每月报告。客户的数量可以增加 ~1000,每个客户可能有 ~10 个这样的报告。

因此,我们正在寻找一种方法,根据每个客户端设置的时间表,使用不同的参数触发 Lambda 函数

例如

客户 A 希望将其数据的每日报告发送到 abc@clienta.com,而客户 B 希望将其数据的每周报告发送到 xyz@clientb.com。因此,Lambda 函数将在周日上午 12 点(对于两个客户)和周一至周六上午 12 点(对于客户 A)调用两次。

我们在 AWS 上找到了以下解决方案,但都存在一些限制。

方法 1:使用 CloudWatch Events

我们可以为每个客户端和每个报告创建一个 CloudWatch Events 规则,以在每个计划中触发我们的 Lambda 函数

优点: 设置简单,易于实施。

缺点

每个 AWS 账户有 100 个事件规则的限制。提到我们可以联系AWS来增加它,但我们不确定它是否可以增加到我们正在寻找的数量(目前是~10k,但我们更喜欢没有这种限制的解决方案) .此外,每个帐户 100 个的限制表明这不是此类用例的合适解决方案。

方法 2:使用阶跃函数

对于每个客户端和每个报告,我们可以创建一个 AWS 状态机。我们可以使用 Step Functions 中的迭代器模式等待一天/一周/一个月,然后重新调用 Lambda 函数

优点: 状态机数量没有限制,因此我们可以轻松扩展。

缺点

Step Functions 有一个限制,它们最多可以运行一年。在我们的案例中,这将是一个问题,因为用户需要在更长的时间内获取报告。在 Step Functions 中有一种方法可以克服这个问题。就在即将达到 1 年限制之前,我们可以取消执行并开始新的执行。总的来说,这个解决方案看起来很复杂。

有人可以在 AWS 上为此提出更好的解决方案吗?

解决方法

您真的需要为每个客户配备一个 CloudWatch 吗?为什么不做类似以下架构的事情。

Report generator architecture

让 cloudwatch 启动一个 lambda,每天检查所有客户端的时间表(或您允许的任何最频繁的报告时间表)。您不希望这花费很长时间,因此您只需检查计划的数据库(即 DynamoDB)并删除有关需要生成到 SQS 队列的任何报告的元数据(即报告类型、客户端信息、目的地电子邮件)。最坏的情况是,执行此操作并没有发现任何可调度的内容,但这应该只需要几秒钟,因此每天运行它的成本非常低。

然后您有一个 lambda,它实际上执行使用队列的报告生成器和电子邮件。这个报告生成器 lambda 将扩展和旋转它需要处理队列上的消息的多个实例。您可以为报告生成器 lambda 设置并发限制,以确保它不会一次启动过多,如果您有 1000 多个客户端时会担心。

所有这些组件的定义和部署都可以通过 AWS SAM 轻松实现自动化。

希望这种替代方法能给您带来更多想法。

,

您可以结合使用这两种方法,以获得最佳结果。

第 1 步:使用 stepfunction 运行您的 lambda。

第 2 步:根据 stepfunction 事件(SUCCESS、FAILED ETC)从 cloudwatch 触发您的 stepfunction。

以这种方式当第 1 步失败或完成 1 年运行时。 Cloudwatch 事件可以根据您传递的 json 输入重新触发它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。