feat(aws-compat): queue attributes for Terraform (FifoQueue, ContentBasedDeduplication, Policy, real timestamps)

- GetQueueAttributes now returns FifoQueue, ContentBasedDeduplication, Policy and
  real Created/LastModifiedTimestamp (previously missing/stubbed '0000000000')
- Queue: add CreatedAt, LastModifiedAt, Policy, ContentBasedDeduplication
- parse FifoQueue/ContentBasedDeduplication in both protocols (StringToBool)
- Policy/RedriveAllowPolicy: normalize JSON-string form to object (JSON protocol
  sent them as string -> SetQueueAttributes failed with InvalidParameterValue)
- persistence: keep new fields in meta DTO + backfill empty timestamps on load
- FIFO dedup is inherent: IsDuplicate/InitDuplicatation gate on IsFIFO only
  (env flag EnableDuplicates=false disabled dedup for all FIFO queues)
This commit is contained in:
Repinoid
2026-10-10 17:29:58 +03:00
parent 22fa2b162a
commit 9f1242aca3
7 changed files with 171 additions and 16 deletions
+16 -7
View File
@@ -92,6 +92,16 @@ type Queue struct {
// Используется для запрета повторного purge ранее чем через 60 секунд
// (требование AWS: PurgeQueueInProgress). Нулевое значение = purge ещё не выполнялся.
LastPurgeTime time.Time
// CreatedAt/LastModifiedAt — для атрибутов CreatedTimestamp/LastModifiedTimestamp
// (AWS отдаёт их в GetQueueAttributes; Terraform читает и без них видел бы drift).
CreatedAt time.Time
LastModifiedAt time.Time
// Policy — resource policy (JSON-строка), храним и отдаём как есть для
// совместимости с Terraform. НЕ исполняется (нет enforcement).
Policy string
// ContentBasedDeduplication — FIFO-атрибут. Храним и отдаём значение,
// переданное клиентом (для совместимости), см. раздел про dedup.
ContentBasedDeduplication bool
}
// LockMu/UnlockMu/RLockMu/RUnlockMu — доступ к per-queue блокировке извне пакета models
@@ -150,13 +160,12 @@ func (q *Queue) UnlockGroup(groupId string) {
}
// IsDuplicate — проверяет, было ли сообщение с таким deduplicationId уже
// добавлено в очередь в пределах deduplication-окна.
//
// Логическая схема: дубликаты отслеживаются ТОЛЬКО для FIFO-очередей с
// включённой дупликацией (EnableDuplicates) и непустым deduplicationId.
// Для остальных случаев дубликаты не отслеживаются (AWS-семантика).
// добавлено в очередь в пределах deduplication-окна (5 минут).
// Дедупликация — НЕОТЪЕМЛЕМОЕ свойство FIFO-очереди (AWS): раньше она зависела
// от env-флага EnableDuplicates=false по умолчанию, и FIFO-очереди не
// дедуплицировали вообще. Теперь — только по IsFIFO и непустому id.
func (q *Queue) IsDuplicate(deduplicationId string) bool {
if !q.EnableDuplicates || !q.IsFIFO || deduplicationId == "" {
if !q.IsFIFO || deduplicationId == "" {
return false
}
@@ -170,7 +179,7 @@ func (q *Queue) IsDuplicate(deduplicationId string) bool {
// фоновой задачей PeriodicTasks (deduplication period expired).
// Для не-FIFO очередей или пустого deduplicationId — no-op.
func (q *Queue) InitDuplicatation(deduplicationId string) {
if !q.EnableDuplicates || !q.IsFIFO || deduplicationId == "" {
if !q.IsFIFO || deduplicationId == "" {
return
}