基于多个 (1k-10k) 计划触发 AWS Lambda 函数
Triggering an AWS Lambda Function based on multiple (1k-10k) schedules
我们有一个 AWS Lambda 函数,它从我们的数据库中为客户查询一些数据并向客户发送报告。有些客户需要每日报告,有些可能需要每周或每月报告。客户数量可以增加到 ~1000,每个客户可能有 ~10 个这样的报告。
所以我们正在寻找一种方法来根据每个客户端设置的时间表使用不同的参数触发 Lambda 函数。
例如:
客户 A 希望将其数据的每日报告发送到 abc@clienta.com,客户 B 希望将其数据的每周报告发送到 xyz@clientb.com。因此,Lambda 函数将在周日中午 12 点(对于两个客户端)和周一至周六中午 12 点(对于客户端 A)调用一次。
我们在 AWS 上找到了以下解决方案,但都有一些局限性。
方法一:使用 CloudWatch Events
我们可以为每个客户端和每个报告创建一个 CloudWatch Events 规则,以在每个计划中触发我们的 Lambda 函数。
优点:
设置简单,易于实施。
缺点:
每个 AWS 账户有 100 个事件规则的限制。它提到我们可以联系 AWS 来增加它,但我们不确定它是否可以增加到我们正在寻找的数量(目前是 ~10k,但我们更喜欢没有这种限制的解决方案) .此外,每个帐户 100 个的限制表明这不是适合此类用例的解决方案。
方法 2:使用阶跃函数
对于每个客户和每个报告,我们可以创建一个 AWS 状态机。我们可以在 Step Functions 中使用迭代器模式等待 day/week/month,然后重新调用 Lambda 函数。
优点:
对状态机的数量没有限制,因此这使我们能够轻松扩展。
缺点:
Step Functions 有一个限制,它们最多可以 运行 一年。这在我们的案例中将是一个问题,因为用户将需要更长的时间来获取报告。在 Step Functions 中有一种方法可以克服这个问题。在即将达到 1 年期限之前,我们可以取消执行并重新开始执行。所以总的来说,这个解决方案看起来很复杂。
有人可以在 AWS 上提出更好的解决方案吗?
您可以结合使用这两种方法,以获得最佳结果。
第 1 步:使用 stepfunction 运行 你的 lambdas。
第 2 步:根据 stepfunction 事件(成功、失败等)从 cloudwatch 触发您的 stepfunction。
这样当第1步失败或完成1年运行。 Cloudwatch 事件可以根据您传递的 json 输入重新触发它。
您真的需要为每个客户配备一个 CloudWatch 吗?为什么不做类似以下架构的事情。
让 cloudwatch 启动一个 lambda,每天检查所有客户端的时间表(或您允许的任何最频繁的报告时间表)。您不希望这花费很长时间,因此您只需检查计划的数据库(即 DynamoDB)并将有关需要生成的任何报告的元数据放入 SQS 队列(即报告类型、客户信息、目的地)电子邮件)。最坏的情况是,这个执行并没有发现任何可调度的东西,但这应该只需要几秒钟,所以成本非常低,每天只需 运行。
然后你有一个 lambda,它实际上执行报告生成器和使用队列的电子邮件。此报告生成器 lambda 将根据处理队列中消息所需的实例数量进行扩展和旋转。您可以为报告生成器 lambda 设置并发限制,以确保它不会一次旋转太多,如果您有 1000 个客户端时这是一个问题。
所有这些组件的定义和部署都可以通过 AWS SAM 轻松实现自动化。
希望这种替代方法能给您带来更多想法。
我们有一个 AWS Lambda 函数,它从我们的数据库中为客户查询一些数据并向客户发送报告。有些客户需要每日报告,有些可能需要每周或每月报告。客户数量可以增加到 ~1000,每个客户可能有 ~10 个这样的报告。
所以我们正在寻找一种方法来根据每个客户端设置的时间表使用不同的参数触发 Lambda 函数。
例如:
客户 A 希望将其数据的每日报告发送到 abc@clienta.com,客户 B 希望将其数据的每周报告发送到 xyz@clientb.com。因此,Lambda 函数将在周日中午 12 点(对于两个客户端)和周一至周六中午 12 点(对于客户端 A)调用一次。
我们在 AWS 上找到了以下解决方案,但都有一些局限性。
方法一:使用 CloudWatch Events
我们可以为每个客户端和每个报告创建一个 CloudWatch Events 规则,以在每个计划中触发我们的 Lambda 函数。
优点: 设置简单,易于实施。
缺点:
每个 AWS 账户有 100 个事件规则的限制。它提到我们可以联系 AWS 来增加它,但我们不确定它是否可以增加到我们正在寻找的数量(目前是 ~10k,但我们更喜欢没有这种限制的解决方案) .此外,每个帐户 100 个的限制表明这不是适合此类用例的解决方案。
方法 2:使用阶跃函数
对于每个客户和每个报告,我们可以创建一个 AWS 状态机。我们可以在 Step Functions 中使用迭代器模式等待 day/week/month,然后重新调用 Lambda 函数。
优点: 对状态机的数量没有限制,因此这使我们能够轻松扩展。
缺点:
Step Functions 有一个限制,它们最多可以 运行 一年。这在我们的案例中将是一个问题,因为用户将需要更长的时间来获取报告。在 Step Functions 中有一种方法可以克服这个问题。在即将达到 1 年期限之前,我们可以取消执行并重新开始执行。所以总的来说,这个解决方案看起来很复杂。
有人可以在 AWS 上提出更好的解决方案吗?
您可以结合使用这两种方法,以获得最佳结果。
第 1 步:使用 stepfunction 运行 你的 lambdas。
第 2 步:根据 stepfunction 事件(成功、失败等)从 cloudwatch 触发您的 stepfunction。
这样当第1步失败或完成1年运行。 Cloudwatch 事件可以根据您传递的 json 输入重新触发它。
您真的需要为每个客户配备一个 CloudWatch 吗?为什么不做类似以下架构的事情。
让 cloudwatch 启动一个 lambda,每天检查所有客户端的时间表(或您允许的任何最频繁的报告时间表)。您不希望这花费很长时间,因此您只需检查计划的数据库(即 DynamoDB)并将有关需要生成的任何报告的元数据放入 SQS 队列(即报告类型、客户信息、目的地)电子邮件)。最坏的情况是,这个执行并没有发现任何可调度的东西,但这应该只需要几秒钟,所以成本非常低,每天只需 运行。
然后你有一个 lambda,它实际上执行报告生成器和使用队列的电子邮件。此报告生成器 lambda 将根据处理队列中消息所需的实例数量进行扩展和旋转。您可以为报告生成器 lambda 设置并发限制,以确保它不会一次旋转太多,如果您有 1000 个客户端时这是一个问题。
所有这些组件的定义和部署都可以通过 AWS SAM 轻松实现自动化。
希望这种替代方法能给您带来更多想法。