客户端出错后如何将消息发送到死信队列



当订阅http端点返回客户端错误时,Amazon SNS不会向死信队列(DLQ(发送消息。

我有一个SNS主题,它正在向https端点发送通知。我还附加了一个死信队列,并启用了传递状态日志记录。

当由于网络超时或来自端点的服务器端错误(例如500(导致通知无法到达端点时,通知进入重试策略,并且在配置的重试量之后,通知被发送到DLQ。这很好用!日志是这样的:

{
"notification": {
"messageMD5Sum": "1234",
"messageId": "123-456-789",
"topicArn": "arn:aws:sns:eu-west-1:1234:mysnstopic",
"timestamp": "2021-06-08 15:15:21.454"
},
"delivery": {
"deliveryId": "84b16cc6-09bd-5186-a6cb-35ff8274dc9d",
"redrivePolicy": "{n  "deadLetterTargetArn": "arn:aws:sqs:eu-west-1:1234:mydlq"n}n",
"destination": "https://my-endpoint.xy/",
"providerResponse": "Socket timeout in HttpClient",
"dwellTimeMs": 30137,
"attempts": 3
},
"status": "FAILURE"
}

但有时,https端点会以客户端错误(例如404(进行响应。在这种情况下,SNS将该通知记录为";成功";并且完成。它不会进入重试策略(正常(,也不会向DLQ发送通知(不正常(。日志如下:

{
"notification": {
"messageMD5Sum": "1234",
"messageId": "123-456-789",
"topicArn": "arn:aws:sns:eu-west-1:1234:mysnstopic",
"timestamp": "2021-06-08 15:24:46.146"
},
"delivery": {
"deliveryId": "111-222-333",
"redrivePolicy": "{n  "deadLetterTargetArn": "arn:aws:sqs:eu-west-1:1234:mydlq"n}n",
"destination": "https://my-endpoint.xy/",
"providerResponse": "Not Found",
"dwellTimeMs": 202,
"attempts": 1,
"statusCode": 404
},
"status": "SUCCESS"
}

文件中说

通常,当亚马逊SNS由于客户端或服务器端错误而无法访问订阅的端点时,消息传递会失败。当Amazon SNS收到客户端错误,或者继续收到消息的服务器端错误,超过相应重试策略指定的重试次数时,Amazon SNS将丢弃该消息,除非订阅附加了死信队列。

根据文档,我希望得到404的通知不是SUCCESS,而是FAILURE,并发送到DLQ。如何配置它以获得所需的效果?

如果我稍后回答这个问题,很抱歉,但根据AWS文档:

确保您的端点响应来自带有适当状态代码的亚马逊SNS。连接将计时在15秒内退出。如果您的终结点在连接超时,或者端点在外部返回状态代码200-4xx SNS的范围将把消息的传递视为失败的尝试。

因此,您需要端点返回503 Service Unavailable等…以便在SNS 中注册为不可交付

最新更新