Lasttest: Exporte als Datenstrom, schnelleres Absenden, Duplikatschlüssel mit Index #47

Merged
thiel merged 1 commit from load into main 2026-10-09 16:04:17 +00:00
Owner

Lasttest mit großen Datenmengen (docs/08), gemessen mit echtem PostgreSQL 16 und 50 000 bzw. 100 000 Antworten. Das neue Skript apps/api/scripts/loadtest.ts (pnpm --filter @fobu/api loadtest) misst Liste, Suche, Auswertung, Vergleich, Exporte, Datenschutz-Suche, Massenaktion, gleichzeitiges Absenden und parallele Auswertungen.

Behoben (Werte bei 50 000 Antworten)

  • Excel-Export: vorher 19 s und ca. 1 GB Heap. Jetzt werden die Antworten blockweise gelesen (Keyset-Cursor) und die Datei als Datenstrom erzeugt (ExcelJS WorkbookWriter): 7,6 s und ca. 60–80 MB. Zusätzlich wird der Datumsformatierer nur noch einmal angelegt statt zweimal je Zeile.
  • CSV-Export: blockweise als Datenstrom statt eines großen Textes.
  • Volltextsuche: blockweise über einen Keyset-Cursor und nur mit den benötigten Spalten.
  • Absenden: vorher wurden unter der Formular-Sperre bei jeder Antwort alle bisherigen gezählt, auch ohne Antwortlimit. Jetzt nur noch bei Limit, mit Teilindex: 25 → 7,5 ms je Antwort.
  • Anmeldungen: Die Platzzählung liest nur noch das betroffene Feld. „Eine pro E-Mail“ prüft über einen Duplikatschlüssel in einer eigenen Spalte mit Index (Migration 0032 mit Nachtrag für bestehende Antworten, beim Veröffentlichen an ein geändertes Duplikatfeld angepasst): 166 → 68 ms je Antwort.
  • Speicher: höchstens zwei Auswertungen gleichzeitig je Prozess. Öffentlich geteilte Ergebnisse werden 30 s zwischengespeichert.

Nebenbei behoben: „Eine Antwort pro …“ ließ sich über „Bearbeiten“ umgehen. Jetzt wird die Prüfung auch beim Ändern durchgesetzt (409 am Feld). Getestet in registrations.test.ts, inklusive Aus- und Wiedereinschalten des Duplikatfelds.

docs/03-deployment.md hat einen neuen Abschnitt „Größenordnungen und Lasttest“, docs/08 einen Abschnitt „Lasttest“, das Handbuch (mit PDF) ist ergänzt.

Geprüft: typecheck, alle Unit-/API-Tests (API 166), Build, e2e Chromium 109/109, Lasttest gegen PostgreSQL 16.

🤖 Generated with Claude Code

https://claude.ai/code/session_015z57Agxa5kZg6szB3zFN3x

Lasttest mit großen Datenmengen (docs/08), gemessen mit echtem PostgreSQL 16 und 50 000 bzw. 100 000 Antworten. Das neue Skript `apps/api/scripts/loadtest.ts` (`pnpm --filter @fobu/api loadtest`) misst Liste, Suche, Auswertung, Vergleich, Exporte, Datenschutz-Suche, Massenaktion, gleichzeitiges Absenden und parallele Auswertungen. **Behoben (Werte bei 50 000 Antworten)** - **Excel-Export:** vorher 19 s und ca. 1 GB Heap. Jetzt werden die Antworten blockweise gelesen (Keyset-Cursor) und die Datei als Datenstrom erzeugt (ExcelJS WorkbookWriter): 7,6 s und ca. 60–80 MB. Zusätzlich wird der Datumsformatierer nur noch einmal angelegt statt zweimal je Zeile. - **CSV-Export:** blockweise als Datenstrom statt eines großen Textes. - **Volltextsuche:** blockweise über einen Keyset-Cursor und nur mit den benötigten Spalten. - **Absenden:** vorher wurden unter der Formular-Sperre bei jeder Antwort alle bisherigen gezählt, auch ohne Antwortlimit. Jetzt nur noch bei Limit, mit Teilindex: 25 → 7,5 ms je Antwort. - **Anmeldungen:** Die Platzzählung liest nur noch das betroffene Feld. „Eine pro E-Mail“ prüft über einen Duplikatschlüssel in einer eigenen Spalte mit Index (Migration 0032 mit Nachtrag für bestehende Antworten, beim Veröffentlichen an ein geändertes Duplikatfeld angepasst): 166 → 68 ms je Antwort. - **Speicher:** höchstens zwei Auswertungen gleichzeitig je Prozess. Öffentlich geteilte Ergebnisse werden 30 s zwischengespeichert. **Nebenbei behoben:** „Eine Antwort pro …“ ließ sich über „Bearbeiten“ umgehen. Jetzt wird die Prüfung auch beim Ändern durchgesetzt (409 am Feld). Getestet in `registrations.test.ts`, inklusive Aus- und Wiedereinschalten des Duplikatfelds. docs/03-deployment.md hat einen neuen Abschnitt „Größenordnungen und Lasttest“, docs/08 einen Abschnitt „Lasttest“, das Handbuch (mit PDF) ist ergänzt. Geprüft: typecheck, alle Unit-/API-Tests (API 166), Build, e2e Chromium 109/109, Lasttest gegen PostgreSQL 16. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_015z57Agxa5kZg6szB3zFN3x
Lasttest: Exporte als Datenstrom, schnelleres Absenden, Duplikatschlüssel mit Index
All checks were successful
check / verify (pull_request) Successful in 12m47s
5affdf3e75
Gemessen mit PostgreSQL 16 und 50 000/100 000 Antworten (scripts/loadtest.ts).
Excel-Export 19 s/1 GB -> 7,6 s/~70 MB, CSV und Suche blockweise, Zählen nur bei Antwortlimit,
schlankere Platzzählung, Duplikatschlüssel (Migration 0032) - gilt jetzt auch beim Ändern.
Höchstens zwei Auswertungen gleichzeitig, geteilte Ergebnisse 30 s zwischengespeichert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015z57Agxa5kZg6szB3zFN3x
thiel merged commit 2a38f9ba57 into main 2026-10-09 16:04:17 +00:00
thiel deleted branch load 2026-10-09 16:04:17 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
thiel/fobu!47
No description provided.