Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么亚马逊多次发送SNS确认请求_Node.js_Amazon Web Services_Aws Sdk_Amazon Sns - Fatal编程技术网

Node.js 为什么亚马逊多次发送SNS确认请求

Node.js 为什么亚马逊多次发送SNS确认请求,node.js,amazon-web-services,aws-sdk,amazon-sns,Node.js,Amazon Web Services,Aws Sdk,Amazon Sns,在从CLI或AWS控制台为http端点创建新的SNS订阅后,我从Amazon收到确认订阅的请求。我的代码执行确认,然后我从Amazon获得响应,即使用SubscriptionArn成功确认订阅。在AWS控制台中,我还看到订阅已确认 但几秒钟后,我收到了亚马逊的另一个确认请求。脚本试图对其进行处理,但Amazon发送了一条错误消息,消息为“订阅已确认”。这被重复了好几次 为什么亚马逊在确认后仍发送确认请求?是否可以检查订阅是否已确认,而不执行confirmSubscription 注意:我使用No

在从CLI或AWS控制台为http端点创建新的SNS订阅后,我从Amazon收到确认订阅的请求。我的代码执行确认,然后我从Amazon获得响应,即使用SubscriptionArn成功确认订阅。在AWS控制台中,我还看到订阅已确认

但几秒钟后,我收到了亚马逊的另一个确认请求。脚本试图对其进行处理,但Amazon发送了一条错误消息,消息为“订阅已确认”。这被重复了好几次

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

注意:我使用NodeJS SDK确认订阅

感谢来自以下网站的

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

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

与其他任何消息一样,原始发送者不会被询问是否应该重试失败的消息——SNS只会重试。这似乎是明智的,即使原始发送者恰好是SNS的另一个内部部分,如订阅确认,这仍然是正确的

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

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

从上面链接的同一页中,在分配的时间内,任何介于200和499之间(含)的响应代码都被视为成功交付

确保您的端点使用适当的状态代码响应来自Amazon SNS的HTTP
POST
消息。连接将在15秒后超时。如果您的端点在连接超时之前没有响应,或者如果端点在200~4xx范围之外返回状态代码,Amazon SNS会考虑将消息传递为失败的尝试。 将4xx状态代码包含在“成功”的概念中似乎是违反直觉的,直到您考虑到“交付”的含义——这意味着您的端点确实收到了消息。4xx响应表明您的端点在某种程度上不喜欢该消息,但该消息确实已传递。这与5xx错误形成对比,从一般意义上讲,5xx错误意味着您的端点无法处理消息(至少目前是这样)

此行为还建议了另一种设计考虑:作为针对“丢失”确认尝试的故障保护,如果您的应用程序尝试联系SNS端点以完成确认失败,您的应用程序应返回一个5xx错误返回给SNS,以便SNS重试,该过程随后可能会成功。

来自:

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

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

与其他任何消息一样,原始发送者不会被询问是否应该重试失败的消息——SNS只会重试。这似乎是明智的,即使原始发送者恰好是SNS的另一个内部部分,如订阅确认,这仍然是正确的

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

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

从上面链接的同一页中,在分配的时间内,任何介于200和499之间(含)的响应代码都被视为成功交付

确保您的端点使用适当的状态代码响应来自Amazon SNS的HTTP
POST
消息。连接将在15秒后超时。如果您的端点在连接超时之前没有响应,或者如果端点在200~4xx范围之外返回状态代码,Amazon SNS会考虑将消息传递为失败的尝试。 包括4xx状态