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

Stop AWS lambda event source from pushing events if downstream service is down

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

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

没有temporarily/dynamically阻止 Lambda 消耗通风口的功能。

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

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

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

如文档中所述:

To throttle a function, set the reserved concurrency to zero. This stops any events from being processed until you remove the limit.

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

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

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

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

我现在的设计是让第二个 lambda 函数监视下游服务的运行状况。当下游宕机时,我会将预留并发设置为0,当它恢复正常时,我会删除并发设置。我还在考虑是否可以让函数在 cloudwatch 事件上触发或在时间间隔内触发,但那是另一个问题。

我没试过这个,但一个选择可能是;

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

缺点之一是;

EventBridge does not provide second-level precision in schedule expressions. The finest resolution using a cron expression is a minute.