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с).