v0.1.35: resolveProtocol — query-mode клиенты парсят JSON-ответы (эмпирика), ошибки AWS-JSON __type
This commit is contained in:
@@ -23,7 +23,7 @@ import (
|
||||
// - если очередь уже есть — просто возвращаем её URL (идемпотентность AWS);
|
||||
// - проверка лимита очередей тенанта (MaxQueues) → LimitExceeded;
|
||||
// - создание очереди с дефолтами и применение переданных атрибутов
|
||||
// (setQueueAttributesV1 с валидацией диапазонов);
|
||||
// (setQueueAttributesV1 с валидацией диапазонов);
|
||||
// - вставка в map с tenant-scoped ключом "{tenantAccessKey}:{queueName}".
|
||||
// 5. Сохранение очереди в Redis (асинхронно, маршалинг под Lock).
|
||||
// 6. Ответ: QueueUrl.
|
||||
|
||||
+2
-2
@@ -64,9 +64,9 @@ func PeriodicTasks(d time.Duration, quit chan bool) {
|
||||
// - пустой ReceiptHandle (не in-flight) — пропускаем;
|
||||
// - VisibilityTimeout ещё не истёк — пропускаем;
|
||||
// - иначе: возвращаем видимость (сброс ReceiptHandle, разблокировка
|
||||
// FIFO-группы, обновление ReceiptTime), инкрементируем Retry;
|
||||
// FIFO-группы, обновление ReceiptTime), инкрементируем Retry;
|
||||
// - если Retry >= MaxReceiveCount и настроена DLQ — переносим сообщение
|
||||
// в DLQ и удаляем из исходной очереди.
|
||||
// в DLQ и удаляем из исходной очереди.
|
||||
func processQueueTick(queue *models.Queue) {
|
||||
// 1. Просроченные записи deduplication-окна.
|
||||
for dedupId, startTime := range queue.Duplicates {
|
||||
|
||||
@@ -22,8 +22,8 @@ import (
|
||||
// 4. Под Lock:
|
||||
// - проверка существования очереди → QueueNotFound;
|
||||
// - защита от повторного purge (фикс): повторный вызов в течение 60 секунд
|
||||
// → PurgeQueueInProgress (требование AWS). Раньше purge можно было
|
||||
// вызывать без ограничений;
|
||||
// → PurgeQueueInProgress (требование AWS). Раньше purge можно было
|
||||
// вызывать без ограничений;
|
||||
// - очистка in-memory сообщений и dedup-записей;
|
||||
// - фиксация LastPurgeTime;
|
||||
// - асинхронная очистка Redis (DEL хэша сообщений) + SaveQueue.
|
||||
|
||||
@@ -26,10 +26,10 @@ import (
|
||||
// 2. Аутентифицированный тенант из контекста (SigV4 → AccessKey).
|
||||
// 3. Валидация входных параметров (AWS-совместимая):
|
||||
// - MaxNumberOfMessages: 1–10; 0 (не задан) = 1. Выход за диапазон — ошибка
|
||||
// InvalidParameterValue (раньше значение молча клэмпилось).
|
||||
// InvalidParameterValue (раньше значение молча клэмпилось).
|
||||
// - VisibilityTimeout: 0–43200 секунд, иначе InvalidParameterValue.
|
||||
// - WaitTimeSeconds: 0–20 секунд; 0 = брать атрибут очереди
|
||||
// ReceiveMessageWaitTimeSeconds.
|
||||
// ReceiveMessageWaitTimeSeconds.
|
||||
// 4. Имя очереди: из QueueUrl (последний сегмент) или из пути /{account}/{queueName}.
|
||||
// 5. Выборка сообщений — АТОМАРНО под одним Lock (см. receiveMessagesUnderLock):
|
||||
// устранена гонка TOCTOU, когда два параллельных receive видели одни и те же
|
||||
@@ -226,6 +226,7 @@ func buildReceiveResponse(messages []*models.ResultMessage) models.ReceiveMessag
|
||||
// - ApproximateFirstReceiveTimestamp — время первой выдачи (ReceiptTime);
|
||||
// - ApproximateReceiveCount — число доставок (NumberOfReceives + 1);
|
||||
// - SentTimestamp — реальное время отправки (SentTime), НЕ время выдачи.
|
||||
//
|
||||
// MD5 тела берётся из кэша (посчитан при SendMessage) — без пересчёта.
|
||||
func buildResultMessage(m *models.SqsMessage) *models.ResultMessage {
|
||||
return &models.ResultMessage{
|
||||
|
||||
@@ -27,7 +27,7 @@ import (
|
||||
// - DeduplicationId и GroupId ≤ 128 символов;
|
||||
// - MessageAttributes ≤ 10;
|
||||
// - FIFO-очередь БЕЗ MessageGroupId → MissingParameter (AWS требует GroupId
|
||||
// для каждой отправки в FIFO);
|
||||
// для каждой отправки в FIFO);
|
||||
// - размер тела ≤ MaximumMessageSize очереди → MessageTooBig;
|
||||
// - число сообщений < лимита очереди (OOM-защита) → OverLimit.
|
||||
// 4. Построение SqsMessage: MD5 тела и атрибутов, UUID, метки времени, задержка.
|
||||
|
||||
Reference in New Issue
Block a user