Features

What Felix does

Streams, key-value caches, queues and counters all sit on one replicated log, behind one access model.

One log read three ways: a stream reads every record in order, a cache keeps only the newest value for each key, and a queue has finished records 0 to 4 and waits at record 5.streamcachequeue01234567abacbadc567
Feature by feature

Streams, state and work on one log

One replicated log behind streams, caches and queues

A stream reads the log forward, a cache keeps the latest value for each key, and a queue is a cursor a consumer group shares. All three use the same durability, recovery and replication.

Resume from an offset

Records on a durable stream carry their log offsets. A subscriber resumes after the last one it saw, and a jump between offsets shows exactly which records it missed.

Slow subscribers stay separate

Each subscriber has its own queue, bounded by count and by bytes (256 MiB by default). Under the default policy a publisher never waits for a slow subscriber, and the others keep their pace.

Quorum streams

A Quorum stream acknowledges a publish once a majority of its replicas, the leader counted, have written it to their logs. With no majority reachable, it is never acknowledged: the publish times out and reports its outcome as unknown.

Failover that keeps acknowledged writes

A lost leader is replaced only by a replica that holds its log, and the new leader fences a majority of the replicas before it serves. Followers report a leader that stops answering, so a durable Quorum stream fails over in about five seconds. A new cluster turns this on when its first broker registers; an upgraded one, once an operator finalizes its fleet features.

Conditional publish

A publish can name the offset it expects to start at. When two writers race for one offset, exactly one succeeds, and the refused one writes nothing.

Range reads and record times

Read a bounded slice of a durable stream without subscribing. Each durable record keeps its append time, and a client can find the first record at or after a time.

Look inside a cluster

felixctl inspect asks each broker what it holds: a shard's leader, lease and follower lag, or every subscription with its queue depth and drops. felix-broker inspect segments checks a data directory offline and says what startup would do with it.

Fine-grained access

Grants go down to one cache key or key prefix, and exchanged tokens can be narrowed by action and resource. A client can act for many users over shared connections, on one broker or across a cluster, each request checked against its own token. A gateway can trade a user's token for a delegated one that names it as the actor, or for one with no permissions that only authenticates its connections.

Revocation reaches open streams

Revoking a principal, or removing a rule that reached it, ends its open streams, subscriptions, cache watches and Kafka connections on every broker within about one control-plane sync, with a revoked error. Deleting a stream ends its subscriptions with stream_deleted.

See what's implemented
Kafka compatibility

Kafka clients

Kafka producers, and consumers that assign their own partitions, work against durable streams: each stream is a topic and each shard a partition. Kafka consumer groups and transactions are not supported.

  • Producers
  • Consumers that assign partitions
  • Consumer groups (not supported)
  • Transactions (not supported)

Without groups or transactions, Kafka Connect, Kafka Streams and ksqlDB don't run.

Kafka in the docs
A Kafka producer and a Kafka consumer that assigns its own partitions talk the Kafka protocol to Felix. In Felix, the durable stream orders is the Kafka topic orders, and its shards 0, 1 and 2 are partitions 0, 1 and 2.producerKafka clientconsumerassigns partitionsKafkaFelixdurable streamorders=topic ordersshard 0=partition 0shard 1=partition 1shard 2=partition 2A Kafka producer and a Kafka consumer that assigns its own partitions talk the Kafka protocol to Felix. In Felix, the durable stream orders is the Kafka topic orders, and its shards 0, 1 and 2 are partitions 0, 1 and 2.producerKafka clientconsumerassigns partitionsKafkaFelixdurable streamorders=topic ordersshard 0=partition 0shard 1=partition 1shard 2=partition 2
Clients

Clients for Rust, Python and TypeScript

All three speak QUIC through one shared implementation and pass every required scenario in the same conformance catalogue. felixctl covers the command line.

Install commands