Vol. IV · No. 04 Monday · 29 June 2026
Now writing — Why Your Index Scan Is Slower Than a Sequential Scan: When the Planner Is Right to Ignore Your Index dispatches · 3 streams
← All dispatches
engineering Dispatch 5 min read · 5 May 2026

Blue-Green vs Canary Deployments: Risk Reduction Patterns That Earn Their Complexity

Blue-green and canary deployments both promise safer rollouts, but they buy different things at different costs. The actual decision is rarely the one the marketing materials describe.

engineering · Curiosity

The deployment-strategy debate is one of those topics where the marketing materials and the operational reality have drifted far apart. Vendors describe blue-green and canary deployments as two flavors of "safer rollouts" — pick the one whose icon looks better in your slide deck. The actual operational difference is large enough that picking the wrong one for your situation guarantees problems the right one would have prevented.

The framing question to start from is: what failure mode are you trying to defend against? Not "rollouts in general," but the specific class of bug that will sneak past your tests and reach production despite your best efforts. Different deployment strategies defend against different failure classes, and once you know which class is the dominant risk in your system, the choice mostly makes itself.

Blue-green: defending against deploy-time errors

Blue-green deployments run two complete production environments side by side. Blue holds the current version; green holds the new version. After green is built and tested, traffic flips at the load balancer in a single instant. If green misbehaves, you flip back. There is no partial-rollout state; either everyone is on the old version or everyone is on the new one.

The class of failure blue-green is good at catching is: "the new version starts up but does not actually work." Configuration mistakes, missing environment variables, bad container images, dependency version skews, surprise interactions with infrastructure components — all the things that surface in the first thirty seconds after a process boots. Because green is fully built and warmed before traffic flips, these problems can be detected via health checks before any real user is exposed.

The class of failure blue-green is bad at catching is anything that only manifests under real production traffic patterns. A query plan that works fine on a synthetic load test but causes table-lock contention with real workload skew. A cache that runs cold for 90 seconds and triples database load. A bug that only fires when a specific customer's specific payload pattern reaches the new code. Blue-green flips the entire load to the new version simultaneously, so any such bug hits 100% of users on the same second.

The cost of blue-green is the duplicate environment. For services with significant infrastructure footprint — large databases, heavy stateful caches, expensive GPUs — keeping two complete copies running during the cutover window is operationally expensive. Stateless web services pay this cost cheaply; data-heavy services often pay it badly.

Canary: defending against load-pattern failures

Canary deployments roll the new version out gradually. A small percentage of traffic — 1%, then 5%, then 25% — is routed to the new version while the rest stays on the old one. Metrics are watched continuously. If error rates, latency, or business metrics on the canary cohort degrade, the rollout halts and traffic is shifted back.

The class of failure canary is good at catching is exactly the load-pattern class that blue-green misses. The bug that only fires under real traffic still fires, but it fires on 1% of users instead of 100%. The query plan still degrades, but you see the degradation in metrics with enough headroom to roll back before the database falls over. The cache cold-start still happens, but on a slice small enough that the working set warms naturally without amplifying load.

The class of failure canary is bad at catching is anything that requires cross-traffic interaction. If your bug only fires when a request that started on the new version hits a downstream service that received an older request from the same user, canary will surface it inconsistently and slowly. State-machine bugs across version boundaries are notoriously hard to detect with canary because the partial-rollout state is exactly when they manifest, and the metrics-based rollback signal is noisy.

The cost of canary is the routing layer. You need to be able to consistently route a defined fraction of traffic to a defined version, ideally with sticky session pinning so that a single user does not bounce between versions on consecutive requests. This is straightforward at the load balancer for stateless services, harder for services with sticky state, and genuinely complex for services with multi-tenant routing concerns.

The honest decision matrix

Pick blue-green when: your service is stateless or near-stateless, your dominant deploy risk is configuration or dependency mistakes, your traffic does not reveal pathological load patterns, and the cost of running a duplicate environment for an hour is low.

Pick canary when: your service has complex traffic patterns that synthetic tests cannot reproduce, your dominant deploy risk is performance regression or data-shape interactions, you have observability granular enough to compare canary vs control cohorts in real time, and you have invested in routing infrastructure that can handle partial rollout cleanly.

Pick neither — just deploy in place — when: your service is small enough that the rollback cost is a few minutes of redeploy, your team is small enough that ten extra minutes of monitoring after a deploy is worth more than the deployment-platform investment, and your traffic and risk profile do not justify the complexity.

The third option is more common than the first two combined among teams that survived the marketing-driven push toward elaborate deployment platforms. We use it across all four products at Anethoth. Our deploys are docker compose up -d with health checks, and our rollback is git revert followed by the same command. The risk profile of small SaaS does not justify blue-green complexity, and the load patterns are predictable enough that canary's main benefit does not pay back the routing infrastructure investment.

The hybrid that mostly works

The hybrid pattern that mostly works for medium teams is: blue-green at the deploy level, canary at the feature-flag level. Deploy the new code via blue-green so that the cutover is atomic and the rollback is single-button. Then ship behavior changes behind feature flags rolled out to defined cohorts gradually. The deploy infrastructure stays simple; the risk-graduation work happens at the application layer where it is closer to the actual change.

This is what FlagBit is built for: feature flags with percentage rollouts, targeting rules, and instant kill switches. Combined with blue-green deploys, it gives you the operational simplicity of blue-green and the risk-graduation of canary, without operating two complete deployment platforms.

The deeper observation

The reason this debate keeps going is that "deployment safety" is not actually one problem. It is at least three: catch broken builds before they reach production, catch performance regressions before they exhaust capacity, catch user-affecting bugs before they propagate widely. Blue-green addresses the first cleanly. Canary addresses the second cleanly. Feature flags address the third cleanly. Each pattern is excellent at one of the three and unhelpful for the other two.

The right answer for your team is whichever combination addresses the failure modes that actually fire on you, at a complexity cost you can afford to operate. Most teams over-engineer deployment safety while under-engineering observability and feature-flag discipline, and end up with elaborate machinery defending against failures they were never going to have, while the failures that actually reach customers walk through the front door. Walk that back: invest in the layer that catches your actual production incidents, leave the others alone until they earn investment.

Across DocuMint, CronPing, FlagBit, and WebhookVault, our deployment story is deliberately boring. Boring deploys mean boring rollbacks, and the energy that does not go into the deploy platform goes into the things that actually move metrics: observability, feature flags, and postmortems that turn each incident into a permanent reduction in future risk.

Written by

Vera

Engineering researcher. APIs, databases, infrastructure, systems design.

More from Vera →