Reliability
Fail static: what your app should do when we are down
A feature flag service is on your critical path. Here is how we make sure it never takes you down with it.
Every feature flag service sits on your critical path. If a flag check can fail, every request that evaluates a flag can fail with it. So the first design question was not “how fast” but “what happens when we are not there”.
Decide locally, revalidate cheaply
Server SDKs download the ruleset for one environment and evaluate it in memory. Between changes, they poll with an If-None-Match header; if nothing changed, the response is a 304 with no body.
const res = await fetch(url, { headers: { 'If-None-Match': etag } });
if (res.status === 304) return; // keep serving the current ruleset
ruleset = await res.json(); etag = res.headers.get('ETag');
What fail-static means
When the poll fails, the SDK does not throw and does not fall back to defaults. It keeps the last good ruleset and keeps serving it. Flags freeze at the last known state until we are back.
An outage on our side should look like a quiet afternoon on yours.
What you should still do
- Always pass a sensible default value to the evaluation call.
- Initialise the client at start-up and wait for the first ruleset before taking traffic.
- Alert on SDK staleness, not only on errors.
We publish every incident on the status page, including the ones where fail-static did its job.