perf(factory): параллелить независимые чтения сборки документа (resolveParallel) #103
Reference in New Issue
Block a user
Delete Branch "perf/factory-parallel-fetch"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
После ускорения PDF (тёплый пул, #100) основное время генерации (~1.5с) ушло в сборку данных документа. В каждом
Action.generateDocumentчтения шли строго последовательно:getTemplate(2 сетевых запроса в explorer) →getMeta(getCurrentBlock) → mongo (getUser/getCooperative/getProject/getVars) → udata/request/meet. Сетевые запросы складывались в задержку.Решение
Хелпер
DocFactory.resolveParallel({...})— резолвит взаимно независимые источники черезPromise.all. В каждом из 46 Action-факторов независимый префикс (template + mongo-чтения + независимые meet/request/udata) сведён в одинresolveParallel; зависимые вызовы оставлены последовательными после батча, порядок и аргументы сохранены:getMeta({ title: template.title })— зависит от template (нельзя в батч: thunk'и в Promise.all исполняются до инициализации деструктурированнойtemplate→ TDZ);getFullName/getCommonUser— от user;getDecision/getApprovedDecision— от coop (+ meta.created_at);getMeetQuestions/getGeneralMeetingDecision— от meet;getProgram— от request.Безопасность
Поведение не меняется — только параллелизуются заведомо независимые чтения. Условные ветки (bank_account по типу юзера, branch по
is_branched, signature-логика) и гварды сохранены на местах. Файлы, где параллелить нечего (только template+meta, а meta зависит от template) — не тронуты.Проверки
tsc --noEmit— чистоeslint(src/Actions, src/Factory) — чистоunbuild— exit 0Базируется на dev (warm-pool #100 уже влит). Эффект: сетевой
getTemplateидёт параллельно с mongo/udata/meet вместо последовательной цепочки → остаток ~1.5с схлопывается к самому медленному одиночному запросу.🤖 Generated with Claude Code
Сборка данных документа в каждом Action делала серию строго последовательных await: getTemplate (2 сетевых запроса в explorer) + getMeta(getCurrentBlock) + mongo-чтения (getUser/getCooperative/getProject/getVars) + udata/request/meet. Сетевые запросы складывались в задержку ~1.5с поверх рендера PDF. Добавлен хелпер DocFactory.resolveParallel({...}) — резолвит ВЗАИМНО НЕЗАВИСИМЫЕ источники через Promise.all. В каждом из 46 Action-факторов независимый префикс (template + mongo-чтения + независимые meet/request/udata) сведён в один resolveParallel; зависимые вызовы оставлены последовательными после батча, с сохранением порядка и аргументов: - getMeta({title: template.title}) — зависит от template (TDZ в Promise.all); - getFullName/getCommonUser — от user; - getDecision/getApprovedDecision — от coop (+meta.created_at); - getMeetQuestions/getGeneralMeetingDecision — от meet; - getProgram — от request. Поведение не меняется — только параллелизуются независимые чтения. Условные ветки (bank_account по типу юзера, branch по is_branched, signature) и гварды сохранены на местах. Файлы, где параллелить нечего (только template+meta, meta зависит от template) — не тронуты. tsc + eslint + unbuild — зелёные. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>