Felix
A QUIC-based distributed event and cache system in Rust: low-latency pub/sub, durable streams, multiplexed caching, and multi-broker clustering.
It exists because some questions don't yield to reading about them. What does backpressure actually cost when one subscriber falls behind and the others aren't supposed to notice? Is a cache genuinely just a log with different semantics on top — and where does that claim break? What happens to an in-flight publish at the moment a leader's lease expires? Felix is where I find out, and the answers arrive as benchmarks and failing tests rather than as opinions.
Streams are sharded across broker owners selected with rendezvous hashing. A publish can enter through any broker and be forwarded to the owner; subscriptions follow bounded owner redirects and resume from their last offset. Durable streams use append-only log shipping, lease-fenced leaders, Leader or Quorum consistency, and caught-up replica promotion so quorum-acknowledged records survive leader failover.
Cluster metadata replicates through a Raft group embedded in the control plane, so surviving the loss of an instance no longer requires an external database; Postgres still works for deployments that prefer it. The cluster suite covers cross-broker routing, broker loss, process suspension, fencing, failover, redirects, reconnect, and single-node/cluster conformance, and the Raft suite adds a killed leader and a wiped volume. It remains in early active development.
The numbers below were measured on an Azure cluster rather than on loopback, with Microsoft Entra checking every token on the publish path. Fanout is what the design is for: a publish is encoded once and shared with every subscriber, so adding 500 of them left the publisher's acknowledgement roughly where it started, around 206 µs. Ingest scales the way the design intends — horizontally. A second broker took the cluster to 2.1× with nothing tuned. Profiling then put a number on the headroom still on the table: one QUIC endpoint task per broker gates the receive path, so a single core sets the pace while the rest of the machine stays free, and encryption — the obvious culprit — turned out to be ~8% of broker CPU against ~22% for that path. More receive endpoints per broker is what that measurement bought. Against Redpanda on the same hardware, both acknowledging from memory, Felix held a p99 of 224 µs while Redpanda's tail reached tens of milliseconds behind its periodic flush; that gap narrows on faster disks, so it says more about a common deployment than about either engine.
181 µs
p50 acked publish · real network
1.0M msg/s
fanout out of one broker · 500 subscribers, zero loss
3.68M msg/s
ingest into the cluster · 256 B, 24 publishers, zero loss
1.63 GB/s
aggregate ingest · zero loss
Three 4-vCPU Azure brokers (D4as_v5) in one availability zone, QUIC with TLS 1.3, and real Microsoft Entra ID verifying every token on the hot path — no loopback, no demo auth. The two message rates measure opposite directions and are not comparable to each other: one counts deliveries leaving a single broker, the other publishes arriving across the cluster. Ingest scales with brokers rather than with a broker's vCPU count — the receive path is a single task per broker — so a per-vCPU figure would mislead. Latency figures are medians of five trials. One provisioned session, so read it as a measurement rather than a leaderboard; full method and caveats on the linked page.