如果下游服务关闭,则停止 AWS lambda 事件源推送事件

问题描述

在使用 aws lambda 的内置事件源映射时,有没有办法动态停止消耗事件?在示例图中,我将依靠 Big Service 的 healthceck 来做出决定。

到目前为止,我知道如果 Big Service 出现故障,我可以重试处理并最终将消息放入 DLQ。我更愿意将消息保留在原始队列中,从而在 Big Survice 返回时保留它们的顺序,而不必管理来自 DLQ 和 FIFO 的处理。

The red X signifies a failing healthcheck

解决方法

我没有尝试过,但可能有一种选择;

  • 创建另一个 lambda 来向 big service 发出健康检查请求
  • 创建一个 EventBridge 规则来触发健康检查 lambda periodically(1 分钟)
  • 如果服务关闭,请使用 UpdateEventSourceMappingEnabled 选项禁用 lambda 和 sqs 之间的源映射。
  • 当服务再次启动时,再次使用 UpdateEventSourceMapping 以启用 sqs 和 lambda 之间的映射。

缺点之一是;

EventBridge 在计划表达式中不提供二级精度。使用 cron 表达式的最佳分辨率是一分钟。

,

没有暂时/动态停止 Lambda 消耗通风口的功能。

唯一的选择是移除触发器,以防止当消息到达 Amazon SQS 队列时激活 Lambda。

然后,当一切正常时,重新添加触发器。我还没有尝试在队列中已经有消息的情况下附加 Lambda 触发器,但希望这些消息会得到处理。

,

我找到了通过 Lambda 的 reserved concurrency 实现这一目标的方法。

如文档中所述:

要限制函数,请将保留并发设置为零。这将停止处理任何事件,直到您取消限制。

Lambda SDK 有一个方便的方法来设置并发。

putFunctionConcurrency(params = {},callback) ⇒ AWS.Request 

当下游服务恢复时,我可以删除该设置并以之前的速度恢复:

 deleteFunctionConcurrency(params = {},callback) ⇒ AWS.Request 

我现在的设计是使用第二个 lambda 函数来监控下游服务的健康状况。当下游down时,我将保留并发设置为0,当它备份时,我将删除并发设置。我仍在考虑是否可以在 cloudwatch 事件上触发该函数或在某个时间间隔触发它,但这是一个不同的问题。