我已经设置了一个函数来命中一个新创建的实体的API端点,但该端点不是立即可用的。如果端点返回“pending”状态,则该函数将抛出一个错误。如果端点返回“active”状态,然后,该功能删除SQS消息,并触发若干其他微服务使用SNS来完成它们的工作。触发函数的SQS队列具有2分钟的可见性超时,而函数本身具有1分钟的超时。
我期望发生的是,如果端点返回“挂起”状态,并且函数抛出错误,则在2分钟可见性超时后,消息将再次触发函数。这应该每2分钟发生一次,直到API调用返回“活动”状态并且消息被删除为止。或者直到超过消息保留期(当前为1小时)。这似乎是一个不错的无服务器方式来轮询我新创建的实体,以检查它是否准备好进行其他后处理。
实际发生的情况是,在将消息添加到SQS队列后,CloudWatch日志显示该函数抛出了一个我所期望的错误,但该函数只被触发了一次。我不知道该消息是出于某种原因而不可见,还是被删除了。我不知道。我是第一次使用SQS作为Lambda触发器,我是不是想错了?
1条答案
按热度按时间afdcj2ne1#
几个可能的原因如下:
1.您的Lambda函数处理程序实际上并没有向Lambda运行时环境抛出异常,因此Lambda认为该函数已经成功处理了该消息,Lambda服务随后从队列中删除了该消息(这样它就不会再次被处理)
1.您的SQS队列有一个配置的DLQ,最大接收数设置为1,因此消息被传递一次,Lambda函数失败,消息随后被移动到DLQ
为了验证这一切都能正常工作,我设置了一个简单的测试,同时使用FIFO和非FIFO队列,并配置队列触发Lambda函数,该函数只记录SQS消息,然后抛出异常。我看到每2分钟向Lambda函数发送相同的SQS消息(这是队列的消息可见性超时)。该情况一直持续到达到SQS重新驱动策略的最大接收计数(默认为10次尝试),此时失败的消息被正确地移动到关联的DLQ。