M10-Bench proves the broker+router tier sustains 10k/s sustained load (2 × loadgen-bench instances × 5000/s each) with:
deliverd-bench — no-op delivery consumercmd/deliverd-bench/main.go — subscribes ba.*.deliveries, ACKs every message immediately.
No Postgres, no FCM/Telegram, no retry, no DLQ. Max throughput is limited only by broker delivery.
docker-compose.yml --profile bench)ingestd ← 10k/s load
routerd ← expands recipients, publishes to ba.*.deliveries
nats ← JetStream broker
deliverd-bench ← consumes + ACKs, no-op
prometheus ← metrics scrape
loadgen-bench-1 ← 5000/s, acme-bench:prom-bench:s3cret-bench
loadgen-bench-2 ← 5000/s, acme-bench:prom-bench:s3cret-bench
NOTE: M10_PLAN.md described 10 instances × 5000/s = 50k/s. Only 2 loadgen-bench-*
instances are defined in docker-compose.yml. This bench smoke targets the actual
10k/s ceiling. 50k/s requires adding 8 more loadgen-bench-* service definitions.
m10_bench_smoke.py — assertion harnessscripts/m10_bench_smoke.py — 4-step smoke:
| Metric | Source | Threshold |
|---|---|---|
ba_ingestd_alerts_received_total{result="accepted"} |
Prometheus | rate ~10k/s ±10% |
ba_recipient_expansion_seconds_bucket (histogram_quantile 0.99) |
Prometheus | p99 ≤ 50ms |
NATS JetStream total_messages across domains |
http://nats:8222/varz |
queue depth < 1000 |
# Local
docker compose --profile bench up -d
python3 scripts/m10_bench_smoke.py
# Remote (parres)
ssh root@192.168.44.94 \
"cd /root/broad-announce && docker compose --profile bench up -d && python3 scripts/m10_bench_smoke.py"
Step 1 — pre-flight
✅ ingestd is up
✅ routerd is up
✅ prometheus is up
✅ loadgen-bench-1 is up
✅ loadgen-bench-2 is up
✅ NATS JetStream is available
Step 2 — 10k/s soak (5 min)
[0m] rate=9900/s rt_p99=12.3ms nats_qd=42 ✅
[1m] rate=10050/s rt_p99=11.8ms nats_qd=38 ✅
...
[4m] rate=9980/s rt_p99=13.1ms nats_qd=55 ✅
Step 3 — broker ceiling check
✅ router p99 over full 5min window: 13.1ms (threshold: 50ms)
✅ NATS queue depth: 55 (max allowed: 1000)
Step 4 — teardown
✅ bench cluster torn down
=== M10-Bench Soak Summary ===
Duration: 5 min
Target rate: 10000/s (±10%)
Router p99 threshold: 50ms
NATS qd max: 1000
🎉 M10-bench smoke: all checks complete.
Result: PASS (exit 0)
M10_PLAN.md Workstream 5 specified 10 loadgen-bench-* instances at 5000/s each
for a 50k/s target. docker-compose.yml only defines 2 instances (loadgen-bench-1
and loadgen-bench-2). This bench smoke tests at the actual 10k/s ceiling.
To test at 50k/s: add 8 more loadgen-bench-N service blocks to docker-compose.yml
(using --instance=loadgen-bench-N and --metrics=:889N for distinct ports), then
update CLUSTER_TARGET = 50000 in m10_bench_smoke.py.
M11 (gRPC bidi-streaming ingest) will re-run this bench profile with loadgen-grpc
replacing loadgen-http to confirm gRPC does not regress the broker+router ceiling.