Appearance
Load-Test Report — Durable Path (Redis + Postgres + mock FMS)
Status: measured (local Docker soak)
Date: 2026-07-11T05:08:27.803Z
Topology: Redisredis://127.0.0.1:16380· Postgrespostgresql://waspada:***@127.0.0.1:15433/waspada_soak· Streams + outbox poller · mock FMS
Ingest: 50 req/s × 20s per fail-rate cell ·OUTBOX_POLL_MS=500·OUTBOX_CLAIM_LIMIT=50·OUTBOX_BACKOFF_BASE_MS=2000(soak-only; prod default 60s) · drain 45000ms while gateway alive after each cell
Matrix
| Fail rate | Throughput | p50 ms | p99 ms | non-2xx | alerts | audit_events | processed_events | outbox succeeded | dead_lettered | mock FMS |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 29.0 | 793 | 1988 | 0 | 600 | 2418 | 600 | 600/609 (98.5%) | 0 | mock ok=600 fail=0 |
| 0.1 | 36.4 | 700 | 1799 | 0 | 747 | 3009 | 747 | 747/757 (98.7%) | 0 | mock ok=747 fail=91 |
| 0.2 | 31.6 | 755 | 2028 | 1 | 650 | 2625 | 650 | 650/660 (98.5%) | 0 | mock ok=650 fail=193 |
| 0.5 | 34.4 | 728 | 1860 | 0 | 708 | 2919 | 708 | 680/718 (94.7%) | 0 | mock ok=680 fail=679 |
How to read this
- alerts / processed_events ≈ durable write + idempotency ledger under the Streams/in-process pipeline.
- audit_events grows with ingest + alert_created + delivery_* kinds (1 INSERT per event today).
- outbox succeeded / total is the recovery rate after the in-process drain window (poller still running). At high fail rates,
failed/dead_letteredshould rise;succeededshould climb as retries land during drain. - Ingest p99 here includes durable encrypt+INSERT path (and Redis store). It is not comparable 1:1 to the memory-only baseline (13/64 ms).
- Durability–latency trade-off: durable-path p99 reflects the cost of guaranteed delivery (Postgres write + Redis Streams publish + outbox commit). Memory-only path is 64 ms p99. This is a measured design cost, not a performance bug.
- Backoff note: production
OUTBOX_BACKOFF_BASE_MSdefaults to 60s. This matrix uses 2s so retry recovery is observable inside the drain window.
Re-run
bash
docker compose -f apps/gateway-api/docker-compose.soak.yml up -d
pnpm --filter @waspada/gateway-api soak:durable
# Single cell
LOAD_TEST_MOCK_FMS_FAIL_RATE=0.2 pnpm --filter @waspada/gateway-api load-test -- --durable --mock-fmsKnown gaps (unchanged)
- No
XAUTOCLAIMPEL sweep (B5) - Audit writes are per-event INSERTs (batch before harder load-test)