SQS: sendMessageToQueue лимиты+sync persist, Reset чистит FIFO, nil-map Duplicates, ApproximateReceiveCount без +1, billing.Close после Shutdown, запрет ':' в access_key, recover в PeriodicTasks

This commit is contained in:
Repinoid
2026-10-11 08:54:21 +03:00
parent e8e0879914
commit 120a44cb6a
6 changed files with 47 additions and 12 deletions
+15 -5
View File
@@ -658,18 +658,28 @@ func (h *Handler) sendMessageToQueue(w http.ResponseWriter, r *http.Request) {
jsonErr(w, http.StatusBadRequest, "body is required")
return
}
// Сообщение строится через общий билдер (UUID + MD5), + проверка размера —
// как в SQS SendMessage.
// Сообщение строится через общий билдер (UUID + MD5), + проверка размера и
// лимита — как в SQS SendMessage (иначе UI обходил бы OOM-защиту).
q.LockMu()
if q.MaximumMessageSize > 0 && len(req.Body) > q.MaximumMessageSize {
q.UnlockMu()
jsonErr(w, http.StatusBadRequest, "message too big")
return
}
if q.LiveCount() >= gosqs.MaxMessagesForQueue(q.IsFIFO) {
q.UnlockMu()
jsonErr(w, http.StatusTooManyRequests, "queue is full")
return
}
msg := gosqs.BuildSqsMessage(req.Body)
q.AppendMessage(msg)
// Персистим одно сообщение отдельно
persistence.SaveMessage(key, &msg)
idx := q.AppendMessage(msg)
// Персистим СИНХРОННО (как SendMessage) — иначе 201 без гарантии записи.
if err := persistence.SaveMessageSync(key, &msg); err != nil {
q.RemoveIndex(idx)
q.UnlockMu()
jsonErr(w, http.StatusInternalServerError, "failed to persist message")
return
}
persistence.SaveQueue(key, q)
q.UnlockMu()
w.Header().Set("Content-Type", "application/json")