<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>API Gateway on Noman Chowdhury Munna | Blog</title><link>http://hellonoman.dev/blog/tags/api-gateway/</link><description>Recent content in API Gateway on Noman Chowdhury Munna | Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 23 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://hellonoman.dev/blog/tags/api-gateway/index.xml" rel="self" type="application/rss+xml"/><item><title>API Gateways &amp; Distributed Resilience Engineering: Auth, Rate Limiting, Circuit Breakers &amp; Tracing</title><link>http://hellonoman.dev/blog/p/api-gateways-and-resilience-architecture/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>http://hellonoman.dev/blog/p/api-gateways-and-resilience-architecture/</guid><description>&lt;img src="http://hellonoman.dev/blog/p/api-gateways-and-resilience-architecture/cover.png" alt="Featured image of post API Gateways &amp; Distributed Resilience Engineering: Auth, Rate Limiting, Circuit Breakers &amp; Tracing" /&gt;&lt;p&gt;Welcome back, everyone. Take your seats.&lt;/p&gt;&#10;&lt;p&gt;In our previous lectures, we mastered reverse proxies and load balancers. Today, we step into the world of &lt;strong&gt;Microservices and Distributed Architecture&lt;/strong&gt; to examine a crucial component: &lt;strong&gt;The API Gateway&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;As companies split monolithic applications into dozens or hundreds of independent microservices, managing security, routing, traffic control, and failure modes across all those services becomes a nightmare. Today, we will explore how an API Gateway solves these problems and how resilience patterns keep microservices online when downstream dependencies fail.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1-demystifying-the-api-gateway-how-does-it-differ"&gt;1. Demystifying the API Gateway: How Does it Differ?&#10;&lt;/h2&gt;&lt;p&gt;Students often ask: &lt;em&gt;&amp;ldquo;Professor, isn&amp;rsquo;t an API Gateway just Nginx with a fancy name?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;While an API Gateway can be built &lt;em&gt;on top&lt;/em&gt; of Nginx (like Kong or APISix), its architectural role extends far beyond standard reverse proxying or load balancing.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| REVERSE PROXY: Network Edge (TLS Termination, Static Files, Simple Forwarding) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| LOAD BALANCER: Traffic Distribution (L4/L7 Health Checks, Round-Robin Pooling) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| API GATEWAY: Application Intelligence &amp;amp; Enterprise Governance |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| - Edge Authentication (JWT / OAuth2 / API Keys) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| - Rate Limiting &amp;amp; Throttling (Token Bucket per Tenant) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| - API Composition / Aggregation (BFF Pattern) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| - Service Discovery &amp;amp; Dynamic Routing |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| - Resilience Engineering (Circuit Breakers &amp;amp; Exponential Backoff) |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="direct-microservice-exposure-vs-api-gateway-entry-point"&gt;Direct Microservice Exposure vs. API Gateway Entry Point&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WITHOUT API GATEWAY (Anti-Pattern)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Mobile App ] ---------&amp;gt; [ User Service (port 8001) ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---------&amp;gt; [ Order Service (port 8002) ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---------&amp;gt; [ Inventory Service (port 8003) ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(Mobile app handles 10 hostnames, 10 CORS setups, duplicate Auth checks)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-------------------------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WITH API GATEWAY (Production Standard)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------+ ---&amp;gt; [ User Service ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Mobile App ] ---------&amp;gt; | API GATEWAY | ---&amp;gt; [ Order Service ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(Single Domain) | (api.store.com) | ---&amp;gt; [ Inventory Service ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="when-is-an-api-gateway-unnecessary-complexity"&gt;When is an API Gateway Unnecessary Complexity?&#10;&lt;/h3&gt;&lt;p&gt;If you are building a single monolithic backend on a single VPS, &lt;strong&gt;you do NOT need an API Gateway&lt;/strong&gt;. Standard Nginx as a reverse proxy is more than enough. Introducing an API gateway to a simple monolith adds unnecessary network latency hops and operational maintenance.&lt;/p&gt;&#10;&lt;p&gt;An API Gateway becomes valuable when you have &lt;strong&gt;multiple microservices&lt;/strong&gt;, distinct client types (Mobile vs Web vs Third-Party APIs), or complex cross-cutting compliance requirements.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="2-backend-for-frontend-bff-pattern"&gt;2. Backend-for-Frontend (BFF) Pattern&#10;&lt;/h2&gt;&lt;p&gt;Different client devices have different bandwidth, screen sizes, and data requirements:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Mobile Client&lt;/strong&gt;: Limited bandwidth, small screen. Wants 1 aggregated API payload with minimal fields.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Web App&lt;/strong&gt;: High bandwidth, desktop display. Wants rich, detailed data payloads.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;IoT Device&lt;/strong&gt;: Ultra-low bandwidth. Needs binary/lightweight JSON payloads.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------------+ ---&amp;gt; [ Microservice A ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Web Client ] ----&amp;gt; | Web BFF Gateway | ---&amp;gt; [ Microservice B ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Mobile App ] ----&amp;gt; | Mobile BFF Gateway | ---&amp;gt; [ Microservice A (Trimmed) ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Instead of forcing a single bloated API Gateway to cater to every device, the &lt;strong&gt;Backend-for-Frontend (BFF)&lt;/strong&gt; pattern deploys dedicated lightweight gateways per client type.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="3-edge-authentication--authorization"&gt;3. Edge Authentication &amp;amp; Authorization&#10;&lt;/h2&gt;&lt;p&gt;One of the greatest benefits of an API Gateway is offloading security from individual microservices.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Client ] -&amp;gt; [ API Gateway ] -- (Validates JWT Signature) --&amp;gt; [ Microservice ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | (Trusts X-User-ID)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-- Invalid JWT? --&amp;gt; Return 401 Unauthorized&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Authentication (AuthN)&lt;/strong&gt;: The Gateway validates the incoming JWT, OAuth2 token, or API Key signature. If invalid or expired, the request is immediately rejected at the gateway edge with an &lt;code&gt;HTTP 401 Unauthorized&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Context Propagation&lt;/strong&gt;: The Gateway decodes the JWT claims (e.g., &lt;code&gt;user_id: 9876&lt;/code&gt;, &lt;code&gt;role: admin&lt;/code&gt;) and injects them into downstream HTTP headers (&lt;code&gt;X-User-ID: 9876&lt;/code&gt;, &lt;code&gt;X-User-Roles: admin&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Downstream Simplicity&lt;/strong&gt;: Internal microservices inside the private network don&amp;rsquo;t need to re-verify cryptographic signatures or touch session databases. They simply read &lt;code&gt;X-User-ID&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="4-traffic-control-rate-limiting--throttling"&gt;4. Traffic Control: Rate Limiting &amp;amp; Throttling&#10;&lt;/h2&gt;&lt;p&gt;To protect backend services from denial-of-service (DoS) attacks or greedy clients, the gateway enforces &lt;strong&gt;Rate Limiting&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TOKEN BUCKET ALGORITHM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Incoming Request ] ---&amp;gt; [ Check Bucket for Tokens ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-----------+-----------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [ Token Available? ] [ No Tokens Left? ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (Consume 1 Token) (Reject Request with HTTP 429)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [ Pass to Service ] [ &amp;#34;Too Many Requests&amp;#34; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="popular-rate-limiting-algorithms"&gt;Popular Rate Limiting Algorithms&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Token Bucket&lt;/strong&gt;: A bucket holds up to $C$ tokens. Tokens are refilled at a constant rate $R$ per second. Each request consumes 1 token. Allows bursty traffic up to bucket capacity.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Leaky Bucket&lt;/strong&gt;: Requests enter a queue (bucket) and leak out at a constant, smooth rate. Smooths out traffic spikes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Sliding Window Log&lt;/strong&gt;: Tracks timestamps of requests in Redis to enforce exact limits over rolling time windows (e.g., max 100 requests per 60 seconds).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="5-resilience-engineering-circuit-breakers--retries"&gt;5. Resilience Engineering: Circuit Breakers &amp;amp; Retries&#10;&lt;/h2&gt;&lt;p&gt;In a microservices architecture, downstream failures are inevitable. If Service C slows down, Service B&amp;rsquo;s thread pool exhausts waiting for C, causing Service B to fail, which takes down Service A. This is a &lt;strong&gt;Cascading Failure&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;To stop cascading failures, we use &lt;strong&gt;Circuit Breakers&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CIRCUIT BREAKER STATE MACHINE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | CLOSED | (Normal Operations: Traffic Flows)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | ^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failure Rate | | Trial Success Rate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Exceeds 50% v | Reaches 100%&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | OPEN | (Failing Fast: Rejects Immediately with 503)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Sleep Window |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Expires (30s) v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | HALF-OPEN | (Trial Period: Allows Limited Probe Requests)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="circuit-breaker-states"&gt;Circuit Breaker States&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Closed&lt;/strong&gt;: Normal state. All requests pass through to the downstream microservice. The gateway monitors failure rates.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Open&lt;/strong&gt;: The failure threshold (e.g., 50% error rate over 10s) was breached. The circuit breaker &lt;strong&gt;trips&lt;/strong&gt;. All subsequent requests fail &lt;em&gt;immediately&lt;/em&gt; at the gateway with an HTTP 503 or return a cached fallback response without touching the broken service!&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Half-Open&lt;/strong&gt;: After a sleep timeout (e.g., 30s), the gateway allows a few probe requests to check if the downstream service has recovered. If probes succeed, the circuit resets to &lt;strong&gt;Closed&lt;/strong&gt;. If probes fail, it returns to &lt;strong&gt;Open&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="the-danger-of-naive-retries-retry-storms"&gt;The Danger of Naive Retries: Retry Storms&#10;&lt;/h3&gt;&lt;p&gt;If a downstream database is struggling under heavy load, and 1,000 clients automatically retry failed requests every 1 second, &lt;strong&gt;the retry volume doubles the load on the dying database, ensuring it never recovers&lt;/strong&gt;. This is a &lt;strong&gt;Retry Storm&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Always implement &lt;strong&gt;Exponential Backoff with Jitter&lt;/strong&gt;:&#10;&lt;/p&gt;&#10;$$\text{Wait Time} = \min(\text{MaxWait}, \text{Base} \times 2^{\text{attempt}}) + \text{RandomJitter}$$&lt;hr&gt;&#10;&lt;h2 id="6-observability-distributed-tracing--correlation-ids"&gt;6. Observability: Distributed Tracing &amp;amp; Correlation IDs&#10;&lt;/h2&gt;&lt;p&gt;When a single user click triggers a call chain across 5 microservices, how do you debug a slow request?&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Gateway ] (Generates X-Request-ID: abc-123)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Service A ] (Propagates X-Request-ID: abc-123)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ Service B ] (Propagates X-Request-ID: abc-123)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Request/Correlation ID&lt;/strong&gt;: The API Gateway generates a unique UUID (&lt;code&gt;X-Request-ID: e4a7b-891...&lt;/code&gt;) for every incoming edge request.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Header Propagation&lt;/strong&gt;: Every microservice MUST inspect incoming HTTP headers and pass &lt;code&gt;X-Request-ID&lt;/code&gt; along when making downstream internal HTTP or gRPC calls.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Centralized Log Aggregation&lt;/strong&gt;: All logs pushed to Elasticsearch/Loki include &lt;code&gt;trace_id&lt;/code&gt;. Engineers can query &lt;code&gt;trace_id == &amp;quot;abc-123&amp;quot;&lt;/code&gt; and view the complete end-to-end execution timeline across all services!&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="classroom-summary--takeaways"&gt;Classroom Summary &amp;amp; Takeaways&#10;&lt;/h2&gt;&lt;p&gt;Today we covered:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;API Gateway vs Reverse Proxy&lt;/strong&gt;: Gateways bring application-level intelligence (Auth, Rate limiting, Transformation, BFF).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Edge Security&lt;/strong&gt;: Validate JWTs at the gateway edge to keep internal microservices clean.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Traffic Shaping&lt;/strong&gt;: Token Bucket algorithms absorb bursts while enforcing tenant quotas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Circuit Breakers&lt;/strong&gt;: Prevent cascading microservice failures by failing fast during downstream outages.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Retry Storms&lt;/strong&gt;: Use Exponential Backoff + Jitter to prevent destroying recovering services.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Correlation IDs&lt;/strong&gt;: Always generate and propagate &lt;code&gt;X-Request-ID&lt;/code&gt; for distributed tracing.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Next class: &lt;strong&gt;Putting It All Together — Production Architecture Blueprints &amp;amp; System Design Interview Scenarios&lt;/strong&gt;. Class dismissed!&lt;/p&gt;&#10;</description></item></channel></rss>