gosqs: персистить перенос в DLQ (SaveMessage в DLQ + DeleteMessagePersist исходной)

This commit is contained in:
Repinoid
2026-10-11 08:34:01 +03:00
parent e720f1ffcb
commit dd9acb3705
5 changed files with 41 additions and 9 deletions
+13 -3
View File
@@ -405,7 +405,17 @@ func (q *Queue) ClearInFlight(i int, receiptHandle string) {
// этого retry-счётчик и DLQ-перенос могли расходиться.
// Вызывать под write-блокировкой q. Перенос в DLQ выполняется под её блокировкой.
// Возвращает: msgUuid, movedToDLQ.
func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid string, movedToDLQ bool) {
// ResetVisibilityAndTryDLQ — сбрасывает видимость сообщения по индексу и, если
// исчерпан MaxReceiveCount, переносит его в DLQ. При переносе удаляет сообщение
// из исходной очереди (tombstone).
//
// Единый путь для одиночной и батчевой ChangeMessageVisibility: раньше логика
// DLQ была только в одиночной версии, а батч лишь инкрементировал Retry — из-за
// этого retry-счётчик и DLQ-перенос могли расходиться.
// Вызывать под write-блокировкой q. Перенос в DLQ выполняется под её блокировкой.
// Возвращает: msgUuid, movedToDLQ, dlqMsg (копия перенесённого сообщения, чтобы
// вызывающий мог персистить его в DLQ; nil если переноса не было).
func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid string, movedToDLQ bool, dlqMsg *SqsMessage) {
q.ensureIndexes()
q.ClearInFlight(i, receiptHandle)
msg := &q.Messages[i]
@@ -420,9 +430,9 @@ func (q *Queue) ResetVisibilityAndTryDLQ(i int, receiptHandle string) (msgUuid s
q.DeadLetterQueue.AppendMessage(dlqMsg)
q.DeadLetterQueue.UnlockMu()
q.RemoveIndex(i)
return msgUuid, true
return msgUuid, true, &dlqMsg
}
return msgUuid, false
return msgUuid, false, nil
}
// InFlightIndexes — снимок индексов in-flight сообщений (для visibility-тика).