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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user