chore(iot): удаление сообщений пакетами DeleteMessageBatch (Этап 5)
Было по одному DeleteMessage на сообщение. Теперь DeleteMessageBatch (до 10 за вызов) с логированием Failed-записей; хелпер deleteMessage удалён.
This commit is contained in:
@@ -155,9 +155,32 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
|
|||||||
log.Error("consumer: flush failed — сообщения НЕ удалены, вернутся после visibility timeout", "err", err)
|
log.Error("consumer: flush failed — сообщения НЕ удалены, вернутся после visibility timeout", "err", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, p := range pending {
|
// DeleteMessageBatch: до 10 записей за вызов (было по одному DeleteMessage
|
||||||
if err := deleteMessage(ctx, sqsClient, queueURL, p.handle, log); err != nil {
|
// на сообщение — лишние round-trip, ревью 2026-10-10).
|
||||||
log.Error("consumer: DeleteMessage failed", "err", err, "message_id", p.id)
|
for i := 0; i < len(pending); i += 10 {
|
||||||
|
end := i + 10
|
||||||
|
if end > len(pending) {
|
||||||
|
end = len(pending)
|
||||||
|
}
|
||||||
|
chunk := pending[i:end]
|
||||||
|
entries := make([]sqstypes.DeleteMessageBatchRequestEntry, 0, len(chunk))
|
||||||
|
for j := range chunk {
|
||||||
|
entries = append(entries, sqstypes.DeleteMessageBatchRequestEntry{
|
||||||
|
Id: aws.String(strconv.Itoa(j)),
|
||||||
|
ReceiptHandle: aws.String(chunk[j].handle),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
out, err := sqsClient.DeleteMessageBatch(ctx, &sqs.DeleteMessageBatchInput{
|
||||||
|
QueueUrl: aws.String(queueURL),
|
||||||
|
Entries: entries,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Error("consumer: DeleteMessageBatch failed", "err", err, "count", len(chunk))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, f := range out.Failed {
|
||||||
|
log.Error("consumer: DeleteMessageBatch entry failed",
|
||||||
|
"id", aws.ToString(f.Id), "code", aws.ToString(f.Code), "msg", aws.ToString(f.Message))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,15 +189,6 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteMessage удаляет обработанное сообщение из очереди.
|
|
||||||
func deleteMessage(ctx context.Context, client *sqs.Client, queueURL string, receiptHandle string, log *slog.Logger) error {
|
|
||||||
_, err := client.DeleteMessage(ctx, &sqs.DeleteMessageInput{
|
|
||||||
QueueUrl: aws.String(queueURL),
|
|
||||||
ReceiptHandle: aws.String(receiptHandle),
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// sendToDLQ — кладёт битое неразборчивое сообщение в DLQ для диагностики.
|
// sendToDLQ — кладёт битое неразборчивое сообщение в DLQ для диагностики.
|
||||||
func sendToDLQ(ctx context.Context, client *sqs.Client, dlqURL, body string, log *slog.Logger) error {
|
func sendToDLQ(ctx context.Context, client *sqs.Client, dlqURL, body string, log *slog.Logger) error {
|
||||||
_, err := client.SendMessage(ctx, &sqs.SendMessageInput{
|
_, err := client.SendMessage(ctx, &sqs.SendMessageInput{
|
||||||
|
|||||||
Reference in New Issue
Block a user