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

亚马逊为何多次向SNS发送确认请求

西门智
2023-03-14

在从CLI或AWS控制台为httpendpoint创建新的SNS订阅后,我从Amazon收到确认订阅的请求。我的代码执行确认,然后我从Amazon得到响应,即订阅已用subscriptionarn成功确认。同样在AWS控制台中,我看到订阅被确认。

但几秒钟后,我收到了另一个来自亚马逊的确认请求。脚本试图处理它,但Amazon发送了一个错误消息“subscription已经确认”。而这又重复了好几次。

为什么亚马逊在确认后还会发送确认请求?是否可以检查订阅是否已确认,而不执行confirmsubscription

谢谢

共有1个答案

蔡辰钊
2023-03-14

摘自SNS开发人员指南:

如果Amazon SNS没有从您的endpoint收到成功的响应,它会尝试再次传递消息。这适用于所有消息,包括订阅确认消息。

从概念上讲,发生的事情似乎是这样的:SNS的一部分(需要确认您的订阅的部分)本质上要求SNS的另一部分(向HTTPendpoint传递HTTP消息的部分)向您的endpoint传递消息。在本例中,是确认消息。

如果不使用HTTP响应代码告诉SNS您收到了消息,则SNS会在几秒钟后重试...因此,即使同时你已经确认了你的订阅,负责向你发送消息的SNS也不知道--从它的角度来看,它只知道你显然没有收到一条消息,这意味着要重试一次。

每次重试时,正在重试的消息将具有相同的x-amz-sns-message-id:请求标头。这使您能够区分重试消息与看起来与先前消息相同但实际上是具有相同负载的不同消息之间的区别。

在上面链接的同一页面中,在分配的时间内,任何在200到499之间的响应代码都被认为是成功的传递。

确保您的endpoint使用适当的状态html" target="_blank">代码响应来自Amazon SNS的HTTPpost消息。连接将在15秒后超时。如果您的endpoint在连接超时之前没有响应,或者如果您的endpoint返回200-4xx范围之外的状态代码,Amazon SNS将认为消息的传递是一次失败的尝试。

在“成功”的概念中包含4xx状态代码似乎是违反直觉的,除非您考虑到“传递”的概念--它意味着您的endpoint确实收到了消息。4xx响应表明您的endpoint在某种程度上不喜欢该消息,但该消息确实被传递了。这与5xx错误形成了鲜明的对比,在一般意义上,5xx错误意味着您的endpoint--至少到目前为止--无法处理消息。

这个行为还建议了另一个设计考虑:作为防止“丢失”确认尝试的故障安全,如果您的应用程序尝试联系SNSendpoint以完成确认失败,您的应用程序应该返回一个5xx错误到back to SNS,这样SNS将再次尝试,该过程可能随后成功。

 类似资料:
  • 我们正在开发一个系统,我们需要向数千部手机发送推送通知。我们使用Amazon SNS进行了设置。我们将向每部手机发送单独的消息,因此我们直接发送到SNSendpointARN,而不是主题ARN。 我们目前正在想这个系统的性能。我在网上找不到任何关于可以向SNS发送多少消息的内容。例如,如果我需要向25000个SNSendpoint发送25000条消息,我可以以多快的速度发送它们?秒、分钟、小时?

  • 当我在Amazon SNS上确认订阅时,出现以下错误: 检测到1个验证错误:“令牌”处的值null未能满足约束:成员不能为null(服务:AmazonS;状态代码:400;错误代码:ValidationError;请求ID:14f5c18d 如何解决这个问题?

  • 脚本: 弹性beanstalk环境有几个web服务器,这些服务器向另一个工作环境发送用户注册请求等。 问题: 当其中一台工作机器完成任务时,我还希望它向web服务器发送确认信息。 SQS似乎没有"确认"消息。 当我们卸载一个发送电子邮件的任务时,我也想让网络服务器知道发送电子邮件是成功的。 我可以做的一个解决方案是实现web服务器轮询的另一个队列,但是,许多服务器可以在同一个队列上轮询,服务器2可

  • 我的Android应用程序中有一个与亚马逊SNS服务相关的问题。我正在使用亚马逊SNS推送服务。请查看此链接http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html有关亚马逊SNS服务的更多详细信息,请参阅。 我像在Amazon samples http://docs . AWS . Amazon . com/SNS/latest/DG

  • 我对amazon sns有奇怪的问题。我正在使用amazon aws的nodejs sdk向android设备发送推送通知。问题是当我将消息发送到亚马逊服务器时,它会返回一个MessageID,但消息没有传递。 这是亚马逊发布的代码: 如果我使用亚马逊控制台发布通知工作完美。此外,如果我从gcmMessage中删除JSON.stringify,它正在发送push通知,但没有gcm数据。

  • 我试着用亚马逊sns发送短信 成功将短信发布到电话号码+23481XXXXXXX。消息“ID”:********************************* 但消息状态显示为“Fail”。 请问在我开始发送短信之前,在验证我的帐户之后,我还有什么其他的事情要做吗?