Narad v1.0.0
Narad graduates to v1.0.0 — first production release.
What Narad is
A WAL-first, AP message broker in a single Go binary. Hit any node to produce, consume, or ack; the cluster does the routing. Queue semantics with visibility leases, fan-out topics, delayed delivery, offset replay, per-topic retention, zstd on disk, Raft-backed metadata. No ZooKeeper, no page of tuning knobs.
Send anything. Produce is a raw octet-stream: JSON, plain text, protobuf, binary — no client-side encoding, no SDK. JSON comes back verbatim, text as text, binary base64-flagged with payload_encoding (#100).
The evidence behind the 1.0
Everything below ran against a live 5-node cluster on Kubernetes.
Soak windows at 1,000 msg/s, full produce→consume→ack flow across parent + fan-out child + 60s-delay child:
- Final window: 47h 28m, 170.9M messages, zero lost, zero produce failures, zero consume errors (4 produce retries total). Delay path fired 0 messages early, 0 overdue.
- Prior windows: ~37h (~133M messages, ended by infrastructure node churn — broker self-healed, zero loss) and ~23h validation windows. 300M+ messages soaked in aggregate.
Chaos matrix — kill -9 of owners, leaders, joiners; restarts mid-produce; all zero-loss.
Crash-recovery hardening — the stale-replica defense family (#71–#74): leader confirmation before destructive reconciliation, freshness-gated catch-up checks, and fresh leaders must Barrier + re-read before trusting their FSM.
Capacity — 50,000 msg/s sustained through the full produce→consume→ack flow on a 3-node cluster; the ceiling was the load generator, not the broker.
Operational drills — mixed-version rolling upgrade (partitioned StatefulSet roll), full backup/restore with demonstrated RPO, cluster scale-out 3→5 live under load, and an offset-replay drill (500 exact-offset reads + determinism checks + 2,000-read hammer) with no impact on live consumers.
Notable since the last beta
- Payloads of any content type consumable end-to-end: JSON verbatim, text as string, binary base64-flagged (#100).
- Ack backpressure: when a partition's acked-ahead set is full, ReserveNext serves only the frontier hole instead of feeding a redelivery spiral (#91).
- Replay error contract: offsets reaped by retention return 410 Gone, negative offsets 400 — not 500s (#99).
- Cluster scale-out via Raft join for fresh nodes (#75, #76).
Docs
Client guide, operator handbook (Helm chart included), and code-level internals: https://debanganthakuria.github.io/narad/
Honesty section
Narad is AP: it stays available and durable through node loss, and in exchange does not guarantee ordering. Partitions are single-owner with no replication — a permanently lost node loses its unconsumed partitions (retention-window data). Rebalance-on-join and node decommission are not in 1.0; new nodes serve partitions of topics created after they join.
🤖 Generated with Claude Code