fix(telemetry): не терять строки при ошибке flush (flushAll + InsertTelemetry)

flushAll и InsertTelemetry (путь заполнения батча) вынимали строки из буфера и
подменяли буфер ДО записи: при ошибке flushTenant строки исчезали. Хуже —
фоновый flusher мог забрать строки, которые consumer ждал в Flush, тогда Flush
видел пустой буфер, возвращал nil, и consumer подтверждал SQS-сообщение с
незаписанными данными (потеря). Теперь при ошибке строки возвращаются в буфер
в обоих путях. ctx проброшен в flushAll/flushTenant. Consumer хранит receipt
handle значением (string), не указателем SDK.
This commit is contained in:
Repinoid
2026-10-07 07:32:00 +03:00
parent 38602b7560
commit b6c083e80f
3 changed files with 42 additions and 14 deletions
+5 -5
View File
@@ -59,14 +59,14 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
// успешного Flush — иначе краш/flush-ошибка = потеря подтверждённых
// сообщений (P0-7).
type pendingAck struct {
handle *string
handle string
id string
}
var pending []pendingAck
for _, msg := range resp.Messages {
if msg.Body == nil || *msg.Body == "" {
log.Warn("consumer: empty message body", "message_id", aws.ToString(msg.MessageId))
pending = append(pending, pendingAck{msg.ReceiptHandle, aws.ToString(msg.MessageId)})
pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)})
continue
}
if err := processTelemetry(ctx, *msg.Body, store, log); err != nil {
@@ -84,7 +84,7 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
continue
}
processBackoff = time.Second
pending = append(pending, pendingAck{msg.ReceiptHandle, aws.ToString(msg.MessageId)})
pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)})
}
if len(pending) == 0 {
@@ -107,10 +107,10 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
}
// deleteMessage удаляет обработанное сообщение из очереди.
func deleteMessage(ctx context.Context, client *sqs.Client, queueURL string, receiptHandle *string, log *slog.Logger) error {
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: receiptHandle,
ReceiptHandle: aws.String(receiptHandle),
})
return err
}