mirror of
https://github.com/TronoSfera/Law.git
synced 2026-05-18 10:03:45 +03:00
15 KiB
15 KiB
Performance Tracking
Дата старта: 2026-03-16
Цель
Снизить воспринимаемую задержку при открытии канбана, карточки заявки и чата. Базовая инфраструктура: 4 vCPU / 8 GB RAM / SSD 150 GB.
Текущая гипотеза
- Основная задержка создается не железом, а лишними round-trip между фронтом и backend/chat-service.
- Карточка заявки загружается несколькими параллельными запросами и при live-обновлениях перезагружается целиком.
- Канбан собирается через загрузку большого массива заявок в Python и дальнейшую агрегацию в памяти.
Backlog
| ID | Задача | Статус | Приоритет | Зависимости |
|---|---|---|---|---|
| PERF-01 | Зафиксировать baseline по ключевым endpoint и сценариям | in_progress | P0 | — |
| PERF-02 | Добавить индекс на requests.assigned_lawyer_id |
completed | P0 | — |
| PERF-03 | Убрать full reload карточки заявки при live-обновлениях | completed | P0 | PERF-01 |
| PERF-04 | Собрать единый endpoint карточки заявки | in_progress | P0 | PERF-01 |
| PERF-05 | Выделить узкие request-scoped endpoints для вложений и счетов | completed | P0 | PERF-04 |
| PERF-06 | Переписать kanban на SQL-first фильтрацию/limit | in_progress | P0 | PERF-01, PERF-02 |
| PERF-07 | Ограничить initial chat payload и добавить догрузку истории | completed | P1 | PERF-03, PERF-04 |
| PERF-08 | Добавить нужные вспомогательные индексы и повторный profiling | planned | P1 | PERF-01 |
PERF-01
Scope
- Добавить серверные замеры для проблемных endpoint без изменения контрактов.
- Помечать в логах и headers целевые сценарии:
- kanban
- request workspace
- chat messages
- chat live
- status route
- attachments
- invoices
Progress
- 2026-03-16: создан tracking-файл.
- 2026-03-16: в работе точечная инструментализация через существующий HTTP middleware.
- 2026-03-16: добавлены
Server-Timing,X-Perf-Label,X-Perf-Duration-Msдля ключевых endpoint. - 2026-03-16: контейнерный тест
python -m unittest tests.test_http_hardening -vпройден. - 2026-03-16: добавлен ops-скрипт
scripts/ops/perf_baseline.shдля repeatable baseline по admin workspace. - 2026-03-16: baseline еще не снят, потому что локальный контур на
localhost:8081не поднят. - 2026-03-16: выполнен
PERF-02- добавлен индексix_requests_assigned_lawyer_id, миграционный тест пройден. - 2026-03-16: dashboard перестроен на приоритетную загрузку
overview, справочники уходят в неблокирующий bootstrap. - 2026-03-16: карточка заявки переведена с generic
attachments/queryиinvoices/queryна узкие request-scoped endpoint. - 2026-03-16:
PERF-05закрыт, backend регресс по чатам/счетам/hardening пройден. - 2026-03-16:
PERF-03начат - admin/liveотдает deltamessages/attachments, hook больше не делает полныйloadRequestModalData()на polling. - 2026-03-16: регресс
tests.admin.test_lawyer_chatпройден, локальная сборкаadmin/index.jsxпройдена. - 2026-03-16:
PERF-03завершен - client/liveтоже переведен на delta без полного reload workspace. - 2026-03-16:
PERF-04начат - admin карточка заявки переведена на единый endpoint/api/admin/requests/{id}/workspace. - 2026-03-16:
PERF-06начат - для канбана в сценарииcreated_newestбез boolean-фильтровcount/order_by/limitперенесены в SQL, чтобы не загружать весь filtered set в Python. - 2026-03-16: добавлен регресс на канбан
limit + total + truncated, контейнерный тестtests.admin.test_status_flow_kanbanпройден. - 2026-03-16: в
compute_sla_snapshotвыборкиStatusHistoryи первых lawyer messages ограничены только активными заявками; это должно ускорить/api/admin/metrics/overviewна первом запросе. - 2026-03-16:
overviewдобавлен в perf-labels и вscripts/ops/perf_baseline.sh, чтобы дальше мерить dashboard отдельно от канбана/workspace. - 2026-03-16: контейнерный регресс
tests.admin.test_metrics_templates tests.test_dashboard_financeпройден после оптимизации overview/SLA. - 2026-03-16: поднят минимальный локальный контур для живых замеров (
db,redis,minio,email-service,chat-service,backend,frontend);frontendушел в restart-loop из-заhost not found in upstream "minio"в nginx-конфиге, поэтому full baseline через:8081не собран. - 2026-03-16: снят manual backend-baseline напрямую через
:8002дляmetrics_overview,kanban,request_workspace; цифры получились низкими на локальном seed и полезны только как smoke-check, а не как репрезентативный perf baseline. - 2026-03-16: исправлен restart-loop
frontendчерез lazy DNS resolve дляminioв nginx, полноценный baseline черезhttp://localhost:8081снова доступен. - 2026-03-16: получен baseline через
:8081после оптимизаций dashboard/workspace:kanban ~17.8 ms avg,metrics_overview core ~12.9 ms avg,metrics_overview_sla ~8.2 ms avg,request_workspace ~14.9 ms avg,chat_live ~14.4 ms avgна локальном seed. - 2026-03-16:
overviewпереведен на двухфазную загрузку: быстрыйinclude_sla=false+ фоновый/api/admin/metrics/overview-sla, чтобы убратьcompute_sla_snapshot()из критического пути dashboard. - 2026-03-16:
PERF-07начат - initial chat payload ограничен окном сообщений, добавленыmessages-windowendpoints для admin/public и догрузка старой истории в UI по кнопке. - 2026-03-16: контейнерные регрессы после paged-chat пройдены:
tests.admin.test_lawyer_chat,tests.test_public_cabinet,tests.admin.test_metrics_templates,tests.test_dashboard_finance,tests.test_http_hardening. - 2026-03-16: добавлен сценарий
scripts/ops/perf_long_chat_workspace.sh, который сидит request с длинным чатом и меряет first open workspace иmessages-windowна живом контуре. - 2026-03-16: long-chat baseline снят на
2000сообщениях, отчетreports/perf/perf-long-chat-workspace-20260316-201459.md:request_workspace ~579 ms avg,messages_window ~650 ms avg, initial payload и older-page оба возвращают только50сообщений из2000. - 2026-03-16: при первом прогоне long-chat сценария выяснилось, что
chat-serviceработал на старом контейнере без актуальныхX-Perf-*headers; после rebuildchat-serviceserver timing дляmessages-windowподтвержден на живом контуре. - 2026-03-16:
PERF-06продвинут дальше - SQL-first window теперь покрывает не толькоcreated_newest, но иsort_mode=lawyer, а boolean-фильтрdeadline_alertпереносится в SQL до загрузки строк. - 2026-03-16: добавлен контейнерный регресс
test_requests_kanban_lawyer_sort_uses_limit_without_losing_total, подтверждающийlimit/truncated/totalдляsort_mode=lawyer. - 2026-03-17: по продовым замерам dashboard все еще создает сетевое давление пачкой справочников на первом маунте; admin UI перестроен так, чтобы на дефолтном входе сначала грузить
dashboard + totp, аbootstrapReferenceData()откладывать до idle. - 2026-03-17:
UserAvatarпереведен наloading="lazy",decoding="async"и low fetch priority для крупных аватаров, чтобы тяжелые изображения юристов меньше конкурировали с API на первом экране dashboard. - 2026-03-17: для
workspaceдобавлены составные индексыmessages(request_id, created_at, id),attachments(request_id, created_at, id),invoices(request_id, issued_at, id); это должно снизить стоимость order-by выборок при открытии заявки. - 2026-03-17: добавлена миграция
0035_workspace_perf_indexes, обновленtests.test_migrations, контейнерный прогон миграций пройден. - 2026-03-17: avatar pipeline исправлен архитектурно: оригинал аватара больше не переписывается, рядом создается
thumb.webp, а admin avatar URLs для small/medium render идут черезvariant=thumb. - 2026-03-17: admin avatar proxy умеет по
variant=thumbотдавать сжатый вариант и, если его еще нет, достраивать его на лету из оригинала; public featured staff URLs тоже переключены на?variant=thumbи умеют так же достраивать thumb на лету. - 2026-03-17:
workspaceупрощен server-side: убрано дублирующееget_request_service() + db.get(Request)внутри одного запроса, read-mark side effects сведены в один проход,mark_admin_notifications_readпереведен на bulk update,status_routeповторно использует уже загруженныйRequest. - 2026-03-17: контейнерные регрессы после avatar/workspace правок пройдены:
tests.test_uploads_s3,tests.test_featured_staff_public,tests.admin.test_lawyer_chat. - 2026-03-17: для admin UI первый
workspaceпереведен в lean-режим:/api/admin/requests/{id}/workspace?include_related=falseтеперь отдает только заявку, чат-окно и базовый finance summary, аattachments / invoices / status-routeдогружаются фоном отдельными endpoint. Это режет количество SQL round-trip в критическом пути на проде с медленной БД. - 2026-03-17: добавлена внутренняя инструментализация
workspace/status-route/serialize_messagesчерезuvicorn.error, чтобы видеть step-by-step ms в контейнерных логах без отдельного profiler. - 2026-03-17: живой локальный профиль подтвердил bottleneck: почти весь
workspaceуходит вmessages_query_ms, а не вstatus-routeили дополнительных запросах. На чате в2000сообщений: при initial window50messages_query_ms ~569 ms, после уменьшения initial window до20messages_query_ms ~239 ms. - 2026-03-17: корневая причина находится в загрузке
Messagerows сEncryptedChatText: дешифровкаMessage.bodyвыполняется на materialize каждого ORM row и дает почти линейную стоимость по числу сообщений в initial window. - 2026-03-17: chat crypto переработан без ослабления защиты: новые сообщения пишутся в
chatenc:v3сper-chatdata key, завернутым master chat key вRequest.extra_fields.chat_crypto; чтениеv1/v2сохранено для обратной совместимости. - 2026-03-17:
Message.bodyбольше не auto-decrypt в ORM. Шифрование тела выполняется наbefore_flush, а дешифровка вынесена вchat_secure_serviceи вызывается только там, где действительно нужен текст сообщения. - 2026-03-17: admin/public
messages-windowпереведены на cursor-параметрыbefore_id + before_created_atс сохранением fallbackbefore_countдля совместимости; UI admin/client переключен на cursor path. - 2026-03-17: initial chat payload для admin workspace и public cabinet стал metadata-first:
workspace/messages-windowмогут отдаватьbody_loaded=false, а тексты догружаются отдельнымmessage-bodiesbatch endpoint только для реально показанных сообщений. - 2026-03-17: добавлены новые endpoint
POST /api/admin/chat/requests/{id}/message-bodiesиPOST /api/public/chat/requests/{track}/message-bodiesс тем же RBAC/session-scope, что и чтение чата. - 2026-03-17: reencrypt path обновлен под новый
v3формат -app/scripts/reencrypt_with_active_kid.pyтеперь мигрирует legacy chat rows в request-scoped AEAD и одновременно заполняетRequest.extra_fields.chat_crypto. - 2026-03-17: контейнерный регресс нового chat stack пройден:
tests.test_reencrypt_with_active_kid,tests.test_public_cabinet,tests.admin.test_lawyer_chat,tests.test_invoices,tests.test_crypto_kid_rotation,tests.test_http_hardening(45 tests OK).
Дальше
- Разобрать server-side стоимость
request_workspaceиmessages-windowна длинном чате: window-пагинация уже работает, но оба endpoint остаются около0.6-0.65s, значит узкое место теперь в запросах/сериализации, а не в объеме initial payload. - Довести
PERF-04до конца и решить, нужен ли такой же unified endpoint для client workspace. - Продолжить
PERF-06для оставшихся режимов канбана, где все еще остается Python-side post-processing:deadline,overdue,has_unread_updates.