Ruby sitar-agent on a Sparkey datastore⟶Java sitar-agent on a WAL-mode SQLite datastore
Airbnb's config-delivery sidecar, sitar-agent, was fully rewritten from Ruby to Java in 2024 — and its local datastore moved off a Sparkey store that had to lock the whole file on every write.
A full Ruby-to-Java rewrite of the sidecar that pushes config changes to tens of thousands of Airbnb pods, chosen for concurrency it didn't have.
AIRBNB·2026·INFRA / KUBERNETES / SIDECAR / JAVA
System stress over timeBreach at T+3
2024Rewrite year
~10sPoll interval
tens of thousands of podsFleet scale
2-3x slowerSQLite vs RocksDB reads
BEFORE
A Sparkey-backed sidecar under growing write load
Sitar is Airbnb’s dynamic configuration system: it lets engineers change critical feature configuration across thousands of services several times a minute, without redeploying anything. Delivering those changes is the job of sitar-agent, a sidecar that runs in every subscribed service pod and keeps configuration synced to the local filesystem. Its original datastore was a Sparkey-backed implementation with a thin wrapper layered on top for concurrent coordination.
AFTER
A Java sidecar, rewritten and re-architected in 2024
In 2024, sitar-agent underwent a full rewrite from Ruby to Java, Airbnb’s mainstream JVM language — and the team used the rewrite to modernize the architecture alongside the language change. On pod startup, the agent now preloads a compressed snapshot from S3 before syncing with the Sitar Service, cutting cold-start time and decoupling startup from Sitar Service availability. After startup it polls the Sitar Service every 10 seconds with jitter, and a 10-second server-side cache plus change tokens keep most of those polls from ever touching the database.
For the local datastore, the team replaced Sparkey with SQLite running in write-ahead logging (WAL) mode, which supports concurrent reads during writes without a custom locking wrapper. Configuration changes now reach thousands of Airbnb’s service instances within tens of seconds, even with tens of thousands of pods polling simultaneously.
THE BRIDGE
Benchmarked two options, shipped the safer one
The team evaluated SQLite against RocksDB across dataset size, read QPS, and memory allocation. RocksDB won on raw performance — tested up to 1500 ops/sec with minimal degradation — but came with a heavier operational model requiring tuning of compaction, block cache, and column families, and a multi-language library ecosystem that was less mature and less uniformly maintained. SQLite’s read latency ran 2-3x slower than RocksDB’s, but the team judged that sufficient for sitar’s actual workload, and it kept first-class bindings across Java, TypeScript, Python, Go, and Ruby — every language sitar’s consumers use.
WHAT IT COST
Isolation over raw efficiency
The rewrite also forced a decision on whether sitar-agent should stay a separate sidecar container or fold into the main application container as a library — the latter would have cut per-pod JVM overhead and removed a container for service owners to manage. Airbnb kept it as an isolated sidecar anyway: folding it in would have meant reimplementing sitar’s logic across Java, Python, Go, TypeScript, and Ruby, and losing the isolation that keeps a sitar bug or resource spike from starving the main application container. The projected cost savings weren’t enough to justify that risk and multi-language maintenance burden.
When your fleet speaks five languages, the “efficient” choice that only works in one of them isn’t actually efficient — it’s a maintenance bill due in the other four.
Both posts describe workloads riding on the same Airbnb Kubernetes platform — one an autoscaled cluster, one a sidecar inside every pod on it.
A plain-language, AI-drafted and human-edited retelling of the article published on medium.com,
reorganized and explained in our own structure and words, with original analysis in the editor's
note above. The facts, numbers, and decisions belong to the original author and are not altered.
For the full depth, read the source.