有没有办法将多个请求/触发器从 SQS 连接到单线程 lambda 函数?



我的应用程序正在使用 lambda 函数 (1) 将数据导入第三个数据库服务器。有时 (1) 会抛出错误,我使用 SQS 来存储从 (1) 抛出的消息。我使用 lambda 函数 (2) 读取 SQS 中的所有消息并通过调用 (1) 重新导入。(2) 每当 SQS 收到消息时都会触发。

完整的错误流:Lambda (1) => SQS => Lambda (2) => Lambda (1)。

问题是,如果维护数据库服务器,它将是无限循环,直到数据库服务器再次激活。

我的解决方案是,创建一个 lambda 函数 (3) 像一个标志一样,检查数据库服务器状态。它将在 SQS 收到新消息时运行,重复运行,直到数据库服务器再次处于活动状态。这次称为 Lambda (2)。

我希望这个 Lambda (3) 是一个单线程(单例?),来自 SQS 的所有请求都在一个线程中。

=> 使用此解决方案,如果数据库服务器关闭,系统只需要重试一个线程。

新流程: λ (1) => SQS => 单线程 λ (3) => λ (2) => λ (1)

我的问题是:

  1. 我的解决方案是否可行?
  2. 如果可能,那么如何设置 Lambda (3) ?
  3. 如果不可能,那么有什么方法可以解决我的问题吗? 请帮忙,谢谢!

这可以通过使用限制和 CloudWatch 计划事件触发器来实现。

您可以将 CloudWatch 计划事件设置为定期运行 lambda 函数 3(负责数据库状态检查的函数)。我不确定你所说的单线程是什么意思,但我想你的意思是最多同时运行该函数的一个实例。这很容易,因为 CloudWatch 计划事件每 x 次(您可以指定的时间量)仅运行一次该函数。

一旦上述函数 (3) 检测到数据库运行状况不佳,它就可以对从 SQS (2) 读取消息的 lambda 函数设置并发限制,并将其限制为 0,以便 lambda 函数 (2) 根本无法执行。

当函数 (3) 检测到数据库运行状况良好时,它将从函数 (2) 中删除此并发限制。

所以lambda函数(3)的代码可能看起来像这样

if db_is_not_healthy:
lambda.put_function_concurrency(
FunctionName=function_2,
ReservedConcurrentExecutions=0
)
else:
lambda.delete_function_concurrency(
FunctionName=function_2
)

您将如何设置 lambda 运行状况检查、何时启动、何时停止它们、对数据库执行 ping 操作的频率取决于您的特定使用案例以及您愿意为此支付的费用。

例如,只有在数据库出现一些错误后,您才能开始对数据库执行 ping 操作。一旦 lambda 函数 (1) 收到错误响应,它就可以通过取消限制来启用运行状况检查 - lambda (3),一旦 lambda (3) 确定数据库再次运行正常,它就可以限制自身,以便仅在数据库出现问题时才执行此运行状况检查。

这绝对不是最优雅的解决方案,但经过一些调整后应该可以工作。

最新更新