HISTORY: нагрузочный тест 30 мин — находки и анализ

This commit is contained in:
“Naeel”
2026-08-14 15:24:34 +04:00
parent 167d5bef41
commit 3a4a5929e9
+32
View File
@@ -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с).