From 3a4a5929e994bad4572d799fa07af83b15afd7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 14 Aug 2026 15:24:34 +0400 Subject: [PATCH] =?UTF-8?q?HISTORY:=20=D0=BD=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D1=81=D1=82=2030?= =?UTF-8?q?=20=D0=BC=D0=B8=D0=BD=20=E2=80=94=20=D0=BD=D0=B0=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=20=D0=B8=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-14-session-log.md | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/HISTORY/2026-08-14-session-log.md b/HISTORY/2026-08-14-session-log.md index 1032e88..76405ad 100644 --- a/HISTORY/2026-08-14-session-log.md +++ b/HISTORY/2026-08-14-session-log.md @@ -397,3 +397,35 @@ SQS-цикл create→send→receive→delete→delete-queue — PASS. Единственный разовый FAIL (DeleteMessage после ChangeMessageVisibility) при первом прогоне не воспроизвёлся — повторный прогон и ручная проверка: exit=0. Случайный сбой сети. + +--- + +## Нагрузочный тест 30 мин (tests/load_test.py) — результаты и находки (14.08.2026) + +**Прогон**: 1800с, 4 воркера, против прода. Итог: 776 операций. +- Корректных: 75; ожидаемых отказов: 0; НЕОЖИДАННЫХ отказов: 653 (коды: 400×549, 404×44, ReadTimeoutError×60); +- Некорректные условия приняты без ошибок: 47; сбоев /health: 1 (разовый таймаут); под НЕ рестартовал. +- Латентность: min 0.08s, avg 2.63s, max 54.4s. Вердикт: ЕСТЬ ПРОБЛЕМЫ. + +**Критично — потери сообщений**: send возвращает успех, receive не отдаёт сообщение. +Воспроизведено БЕЗ нагрузки: 3 из 25 циклов (и 2 из 25 под нагрузкой). Зависания receive >10с. + +**Недостатки обработки ошибок (пробы)**: на некорректные запросы сервис отдаёт сырые +HTTP 400/404 без AWS-XML (SDK получает Code=None) или молча принимает недопустимое: +- SetQueueAttributes: VisibilityTimeout=43201 принят; неверное имя атрибута принято; + нечисловое значение → сырой 400. +- SendMessage: пустое тело → сырой 400; 300КБ → сырой 400; несуществующая очередь → сырой 400. +- Batch: 11 записей / дубли Id / пустой список → сырой 400. +- DeleteMessage с битым ReceiptHandle → сырой 404. +- ReceiveMessage MaxNumberOfMessages 11/0/-1 — принято (клэмпится). +- Повторный PurgeQueue (<60с) — принят; DeleteQueue несуществующей — принят. +- FIFO SendMessage без MessageGroupId — принят. + +**Мой предварительный анализ кода** (для Sonnet): +- models.go IsReadyForReceipt(): showAt = SentTime + randomLatency(конфиг, сейчас 0/0) + DelaySecs. +- gosqs.go PeriodicTasks (1с): сброс видимости, dedup, DLQ; LockGroup держится до UnlockGroup. +- send_message.go: добавление в SyncQueues.Queues[key].Messages + SaveMessage(Redis); + память — единственный источник для receive (Redis не читается) — при 2+ подах/редиплое + сообщения, принятые одним подом, невидимы другому. +- receive_message.go: skip сообщений с ReceiptHandle != "" и не готовых; long poll 100ms тик. +- ReadTimeout 60× и max latency 54с — подозрение на платформенный ingress (аналог /ui 152с).