bridge: MessageID=хэш(дедуп), классификация permanent/transient SQS-ошибок, бесконечный ретрай подписки, валидация ns/deviceID
This commit is contained in:
@@ -12,6 +12,7 @@ package bridge
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"log/slog"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
@@ -19,6 +20,7 @@ import (
|
||||
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||
"github.com/aws/smithy-go"
|
||||
)
|
||||
|
||||
// Константы диспатчера.
|
||||
@@ -176,6 +178,12 @@ func (d *sqsDispatcher) sendWithRetry(ctx context.Context, body string) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
// Permanent ошибки (неверный параметр/размер/нет очереди/доступ) — ретрай
|
||||
// бессмыслен: вернуть сразу, иначе воркер залип бы на poison-сообщении и
|
||||
// заполнил буфер (дроп остальных).
|
||||
if isPermanentSQSErr(err) {
|
||||
return err
|
||||
}
|
||||
if ctx.Err() != nil {
|
||||
// shutdown: ctx отменён, ретраить бессмысленно.
|
||||
return err
|
||||
@@ -190,3 +198,19 @@ func (d *sqsDispatcher) sendWithRetry(ctx context.Context, body string) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// isPermanentSQSErr — true для ошибок SQS, которые не пройдут ни при каком
|
||||
// ретрае (валидация, размер, отсутствие очереди, доступ). Остальное (throttling,
|
||||
// 5xx, сеть) — retryable.
|
||||
func isPermanentSQSErr(err error) bool {
|
||||
var apiErr smithy.APIError
|
||||
if errors.As(err, &apiErr) {
|
||||
switch apiErr.ErrorCode() {
|
||||
case "InvalidParameterValue", "InvalidMessageContents", "MessageTooBig",
|
||||
"QueueDoesNotExist", "InvalidAddress", "InvalidSecurity",
|
||||
"AccessDenied", "InvalidBatchEntryId":
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user