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.
- 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. This is sometimes referred to as compute-compute separation.
- Autoscaling. Query and indexing nodes are automatically scale with demand.
- Smart Caching. After initial queries, data is cached on NVMe SSD (~3s for 1M documents) and frequently accessed namespaces are stored in memory
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.