Software systems are getting bigger and more complex. And we are constantly looking for ways to test code in production without risking user experience. Canary deployments is a popular mechanism for rolling out changes incrementally, allowing us to limit the blast radius in case something goes wrong. However, they’re not without limitations. Canary deployments essentially sacrifice a small portion of users for the greater good. But what if you want to gain insights without impacting any real users? That's where the dark read pattern comes in. Canary Deployments: a quick primerCanary deployments let you release updates to a small subset of users while leaving the majority untouched. The process is simple:
Canary deployments work well for testing new features or configurations in real-world settings. However, they can impact the experience for users in the canary group. If something goes wrong, they will feel it. The Dark Read patternThe Dark Read pattern takes a fundamentally different approach. It involves deploying the new version alongside the old one and executing both in parallel. The user request is served from the existing system, but the request is simultaneously executed against the new system to observe its behaviour and validate its response. This way, you can see how the new code would perform if it were handling production traffic without impacting user experience. Think of it as a “shadow test”. The goal is to see:
The Dark Read pattern in actionAt DAZN, my team was responsible for rewriting the "schedule service". It's responsible for deciding what content the user sees on the home screen and is one of the most business-critical services. Given the business criticality, we opted for the Dark Read pattern.
We ran this for several weeks and were able to identify edge cases and fix bugs without impacting any users. This pattern is very effective for backend services where the focus is on response accuracy, latency, and handling load rather than UI or frontend logic. You get the perks of testing in production without the direct risk to user experience. Why Use Dark Read Over Canary?1. No User Impacts 2. Ideal for Load Testing in Production 3. More Extensive Validation 4. Continuous Monitoring without Worrying about Rollback Drawbacks1. Increased Complexity Running two versions of code in parallel adds architectural complexity and requires infrastructure for mirroring traffic, logging, and comparing results. 2. Applicable Only to Certain Types of Tests Dark reads are great for validating logic and load handling but won’t help in testing UX, frontend changes, or how users interact with a new feature. 3. Additional Costs Duplicating traffic and processing them twice leads to increased costs, especially under high traffic. ConclusionWhile the dark read pattern doesn’t replace canary deployments, it’s a useful tool to have in your arsenal. Canary deployments provide controlled, real-world testing with an impact radius, while dark reads offer shadow testing without risking real-world effects. For critical backend changes, database migrations, or performance improvements, dark reads enable deeper insights without risking real user impact. Related posts |
Join 13K readers and level up you AWS game with just 5 mins a week. Every Monday, I share practical tips, tutorials and best practices for building serverless architectures on AWS.
2024 was the year I got back and amongst the community, and it felt great to be back! Blog I published 33 new blog posts. As a whole, my blog garnered 353k views from 255k visitors. About half of them came through Google search. This is down from 2023... but the decline is offset by more people reading my content through my newsletter nowadays. Most read blog posts: Hit the 6MB Lambda payload limit? Here’s what you can do When to use Step Functions vs. doing it all in a Lambda function How to...
One of my favourite questions from the November cohort of Production-Ready Serverless [1] is, "How do you handle e2e tests involving multiple services across bounded contexts?" In a microservices environment, testing user journeys that span across multiple bounded contexts requires collaboration and a clear delineation of responsibilities. Depending on how your organisation is structured, different teams are responsible for testing parts or the entirety of the user journey. For example... The...
The ability to invalidate a user's session with immediate effect is a common enterprise requirement. For example: If a user's credentials are compromised, we need to immediately revoke the user's access and force the user to change credentials. If an employee is terminated or an external contractor's access is revoked, their session should be invalidated immediately to prevent misuse. Many regulations mandate strict access controls and the ability to prevent unauthorized access in real time....