This document serves as a brief reference of turbopuffer's guarantees:
- Durable Writes. Writes are committed to object storage upon successful return by turbopuffer's API.
- Consistent Reads. Queries return the most recent data by default, i.e. turbopuffer is not eventually consistent. This is configurable to improve performance at the cost of read consistency.
- Atomic Batches. All writes in an upsert are applied simultaneously.
- Any node can serve queries for any namespace. HA does not come as a cost/reliability trade-off. Our HA is the number of query nodes we run.
- Object storage is the only stateful dependency. This means there is no separate consensus plane that needs to be maintained and scaled independently, simplifying the system's operations and thus reliability. All concurrency control is delegated to object storage.
- Compute-Compute Separation. Query nodes handle queries and writes to object storage and the write-through cache. All expensive computation happens on separate, auto-scaled indexing nodes.
- Smart Caching. After a cold query, data is cached on NVMe SSD and frequently accessed namespaces are stored in memory. turbopuffer does not need to load the entire namespace into cache, and then query it. The storage engine is designed to perform small, ranged reads directly to object storage for fast cold queries.
- Autoscaling. Query and indexing nodes are automatically scale with demand.
Regarding ACID properties: turbopuffer provides Atomicity, Consistency, and
Durability. Isolation is not applicable as transactions are not supported.
For CAP theorem: turbopuffer prioritizes consistency over availability when
object storage is unreachable. You can adjust this to favor availability through
query configuration.
For more details, see Tradeoffs, Limits,
and Architecture.