当前位置: 首页 > 知识库问答 >
问题:

SNS何时重试向Lambda发送消息,我可以强制执行吗?

朱乐逸
2023-03-14

我设置了一个Lambda,如下所示:

exports.handler = async (event) => {
  throw new Error('I AM SAD');
};

它可以由SNS主题和API网关调用。

我还设置了一个包含两个订阅的SNS主题;一个直接向Lambda发送消息(使用Lamba协议);另一个通过API网关(HTTPS)发送。我希望SNS在lambda失败时重试发送消息。但它似乎只能通过API网关工作。当直接调用Lambda时,SNS只尝试一次(并报告成功)。

我知道即使是SNS也有某种重试策略-

来自亚马逊SNS死信队列-亚马逊简单通知服务:

当Amazon SNS具有过时的订阅元数据时,可能会发生客户端错误。当所有者删除endpoint(例如,订阅亚马逊SNS主题的Lambda函数)或所有者以阻止亚马逊SNS向endpoint传递消息的方式更改附加到订阅endpoint的策略时,通常会发生这些错误。亚马逊SNS不会重试由于客户端错误而失败的消息传递。

失败的lambda(如上所述)是否被视为客户端错误?我可以强制服务器端错误吗?

共有1个答案

翟默
2023-03-14

Lambda函数引发的异常不是客户端错误。这些故障是由于配置错误而引起的,而不是由于功能代码中的异常。

SNS只尝试一次(并报告成功)。

这与设计相符。SNS成功地将请求传递给Lambda服务,以使用发布到SNS的消息负载异步调用Lambda函数。

当SNS调用Lambda函数时,它只会将该请求传递给Lambda服务一次。SNS唯一会重试的时间是它未能联系Lambda服务,或者请求未经授权,如果Lambda或SNS内部或服务之间的中断阻止它们通信,或者权限不正确,就会发生这种情况。

Amazon SNS通过包含消息和元数据的事件异步调用您的函数。

...

对于异步调用,Lambda将消息排队并处理重试。如果Amazon SNS无法到达Lambda或消息被拒绝,Amazon SNS会在几个小时内每隔一段时间重试一次。有关详细信息,请参阅亚马逊SNS常见问题解答中的可靠性。

https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html

一旦发出调用请求,SNS就不再参与该事件。

重试失败调用的是Lambda服务。

一些AWS服务,例如Amazon Simple Storage Service(Amazon S3)和Amazon Simple Notification Service(Amazon SNS),异步调用函数来处理事件。当异步调用函数时,您不会等待函数代码的响应。您将事件交给Lambda,Lambda处理其余的。您可以配置Lambda处理错误的方式,并可以将调用记录发送到下游资源,以将应用程序的组件链接在一起。

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

默认情况下,您应该会看到日志,这些日志表明Lambda在1分钟和2分钟重试后总共调用了3次异常抛出函数。

 类似资料:
  • 我有一个有状态的应用程序,它维护与用户的会话。此应用程序有 5 个实例。 以下是主题: 所有主题都有5个分区。 Topic1和topic2分别用于建立州商店和全球故事。这两个主题都使用用户名作为消息键。这些主题中的数据由应用程序实例本身生成。 现在,另一个应用程序使用与消息键相同的用户名向topic3生成数据。 我的期望是它将进入同一个分区,该分区由在其本地状态存储中拥有该用户的实例使用。这是对的

  • 我需要使用< code>aws-sdk-go lib通过设备令牌数组向多个设备发送SNS推送通知。 目前我正在使用以下步骤向SNS发送推送消息: 创建endpoint: 将消息发送到endpoint: 我还没有见过一种方法,只使用一个请求就可以将一个推送消息发送到多个设备。可能吗? 像这个例子来说明:

  • 标题是不言自明的,我希望能够向父执行元发送消息(意味着我希望父执行元的)。在Akka Classic(非类型化)中,父执行元的可以通过以下方式从子执行元的获得: (例如,参见这个问题(在Java))。 但是,Akka Typed中的不公开父级的。Scala中是否有惯用的方法为父执行元获取?

  • 我有一个Amazon Lambda实例和一个Amazon SNS实例。Lambda代码监视我们数据库中的变化,我希望它打电话给Amazon SNS,向我们的用户发送推送。例如: 当我们论坛上的用户收到新消息时,Lambda代码会在每次运行(每10分钟)时识别出这一变化,并应通过SNS向用户的智能手机发送推送。 说到文档,我遇到了麻烦;亚马逊的文档只讨论了如何通过SNS触发Lambda代码,而不是反

  • 我正在Symfony3上开发REST API应用程序。我想注册移动设备并向它们发送直接推送通知。例如,当一个用户向另一个用户发送反馈时,第二个用户将获得推送通知。 有了Amazon SNS,可以不广播,而是直接从服务器通知单个设备吗?