<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk" -->

---
title: System Design Drill Day 10: Circuit Breakers, Timeouts...
description: This system design drill shows how to stop a flapping payment or SMS provider from taking down a whole Laravel marketplace. It covers timeouts on every...
canonical: https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: System Design Drill Day 10: Circuit Breakers, Timeouts and Degradation | daily.dev
og:description: This system design drill shows how to stop a flapping payment or SMS provider from taking down a whole Laravel marketplace. It covers timeouts on every...
og:url: https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk
og:image: https://api.daily.dev/og/posts/Dw1GAGwLk.png
og:image:alt: System Design Drill Day 10: Circuit Breakers, Timeouts and Degradation
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# System Design Drill Day 10: Circuit Breakers, Timeouts and Degradation

**[C\# Corner](https://daily.dev/sources/csharpcorner)** · 7 min read · 0 upvotes · 0 comments

## Summary

This system design drill shows how to stop a flapping payment or SMS provider from taking down a whole Laravel marketplace. It covers timeouts on every outbound HTTP call, a single Redis-backed circuit breaker per dependency shared across 3 app servers, bulkheads that give each dependency its own queue, and fallbacks like alternate OTP channels or a payment_pending order state. In the scenario, 30% of calls time out for 2 to 5 minutes, pushing checkout p95 from 400ms to several seconds. The guidance: queue jobs should release themselves with backoff instead of throwing, and anything that moves money should fail closed.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.c-sharpcorner.com/article/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation>

## Questions this post answers

### Why should a circuit breaker's state be shared in Redis instead of kept locally on each server?

A shared circuit in Redis lets all app servers trip and recover together after one failure threshold is hit. With a per-server breaker, each server has to independently discover the outage and keeps hammering the failing provider until it does, whereas a shared circuit trips once and one half-open probe decides recovery for every server.

_Designing multi-server resilience patterns? daily.dev surfaces practical breakdowns like this circuit breaker drill._

### How should a Laravel queue job behave while a circuit breaker for an external payment API is open?

It should release itself back onto the queue with a delay instead of throwing an exception, since throwing counts as a failure and burns through retries on failures you already know are coming, eventually landing in failed_jobs. Because a release still counts as an attempt in Laravel, limit the job with maxExceptions or a time-based retryUntil() rather than a low $tries value.

_Building retry logic around flaky APIs in Laravel, daily.dev collects hands-on guides on queue resilience patterns._

### Should an e-commerce checkout fail immediately, queue the payment, or mark the order as pending when the payment provider's circuit breaker is open?

For a payment provider that flaps for just a few minutes, showing a clear 'try again shortly' message while keeping the cart is usually the right call. Failing immediately is simple but loses sales, queuing keeps the sale but leaves the user without an answer, and marking the order payment_pending gives the best experience but requires reconciliation and stock holds that expire.

_Weighing checkout failure modes for payment outages, daily.dev brings together system design breakdowns like this one._

## Similar posts on daily.dev

- [System Design Drill Day 3: Queues and Async Jobs for Checkout](https://daily.dev/posts/system-design-drill-day-3-queues-and-async-jobs-for-checkout-f7kvhxu3z) · C\# Corner · 0 upvotes · 0 comments
- [System Design Drill Day 7: Rate Limiting APIs, Logins and OTPs with Redis](https://daily.dev/posts/system-design-drill-day-7-rate-limiting-apis-logins-and-otps-with-redis-vwvetnmnk) · C\# Corner · 3 upvotes · 1 comments
- [When Retries Make Things Worse: Protecting Your System From Overload](https://daily.dev/posts/when-retries-make-things-worse-protecting-your-system-from-overload-gersnb7xl) · W endell Adriel · 2 upvotes · 0 comments
- [Circuit Breaker for Laravel](https://daily.dev/posts/circuit-breaker-for-laravel-w00ae4udj) · Laravel News · 39 upvotes · 0 comments
- [3 Resilience Patterns That Keep a Backend Service Up When Its Dependencies Aren't](https://daily.dev/posts/3-resilience-patterns-that-keep-a-backend-service-up-when-its-dependencies-aren-t-by1axueza) · The T-Shaped Dev · 0 upvotes · 0 comments

---

Tags: [#career](https://daily.dev/tags/career), [#laravel](https://daily.dev/tags/laravel), [#redis](https://daily.dev/tags/redis)

[View this post on daily.dev](https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"System Design Drill Day 10: Circuit Breakers, Timeouts and Degradation","url":"https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk"},"datePublished":"2026-10-28T12:08:49.878Z","dateModified":"2026-10-28T15:00:06.645Z","description":"This system design drill shows how to stop a flapping payment or SMS provider from taking down a whole Laravel marketplace. It covers timeouts on every...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/151f334137588fef605272f7ade59074?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/151f334137588fef605272f7ade59074?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"C# Corner","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"C# Corner","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/ada2d584df6241748fc4e71878dc70a3","url":"https://daily.dev/sources/csharpcorner"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"career,laravel,redis","timeRequired":"PT7M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"C# Corner","item":"https://daily.dev/sources/csharpcorner"},{"@type":"ListItem","position":3,"name":"System Design Drill Day 10: Circuit Breakers, Timeouts and Degradation"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/system-design-drill-day-10-circuit-breakers-timeouts-and-degradation-dw1gagwlk#faq","mainEntity":[{"@type":"Question","name":"Why should a circuit breaker's state be shared in Redis instead of kept locally on each server?","acceptedAnswer":{"@type":"Answer","text":"A shared circuit in Redis lets all app servers trip and recover together after one failure threshold is hit. With a per-server breaker, each server has to independently discover the outage and keeps hammering the failing provider until it does, whereas a shared circuit trips once and one half-open probe decides recovery for every server. Designing multi-server resilience patterns? daily.dev surfaces practical breakdowns like this circuit breaker drill."}},{"@type":"Question","name":"How should a Laravel queue job behave while a circuit breaker for an external payment API is open?","acceptedAnswer":{"@type":"Answer","text":"It should release itself back onto the queue with a delay instead of throwing an exception, since throwing counts as a failure and burns through retries on failures you already know are coming, eventually landing in failed_jobs. Because a release still counts as an attempt in Laravel, limit the job with maxExceptions or a time-based retryUntil() rather than a low $tries value. Building retry logic around flaky APIs in Laravel, daily.dev collects hands-on guides on queue resilience patterns."}},{"@type":"Question","name":"Should an e-commerce checkout fail immediately, queue the payment, or mark the order as pending when the payment provider's circuit breaker is open?","acceptedAnswer":{"@type":"Answer","text":"For a payment provider that flaps for just a few minutes, showing a clear 'try again shortly' message while keeping the cart is usually the right call. Failing immediately is simple but loses sales, queuing keeps the sale but leaves the user without an answer, and marking the order payment_pending gives the best experience but requires reconciliation and stock holds that expire. Weighing checkout failure modes for payment outages, daily.dev brings together system design breakdowns like this one."}}]}
```

