<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roshan singh</title>
    <description>The latest articles on DEV Community by Roshan singh (@roshan_singh_dd54d52bbaa7).</description>
    <link>https://dev.to/roshan_singh_dd54d52bbaa7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3839420%2F5e120b67-904e-4b10-96a3-9bc665b0a71b.png</url>
      <title>DEV Community: Roshan singh</title>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roshan_singh_dd54d52bbaa7"/>
    <language>en</language>
    <item>
      <title># 🚀 Idempotency Keys in Payment APIs: Preventing Duplicate Transactions Explained</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Thu, 23 Jul 2026 11:56:23 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-idempotency-keys-in-payment-apis-preventing-duplicate-transactions-explained-ac6</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-idempotency-keys-in-payment-apis-preventing-duplicate-transactions-explained-ac6</guid>
      <description>&lt;p&gt;Have you ever wondered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Why don't payment apps charge me twice if I accidentally click the Pay button multiple times?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What happens if my internet disconnects while making a payment?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is &lt;strong&gt;Idempotency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're learning backend development, this is one of those concepts every backend engineer should understand.&lt;/p&gt;

&lt;p&gt;Let's learn it from scratch.&lt;/p&gt;




&lt;h1&gt;
  
  
  🤔 The Problem
&lt;/h1&gt;

&lt;p&gt;Imagine you're buying a laptop online.&lt;/p&gt;

&lt;p&gt;You click the &lt;strong&gt;Pay&lt;/strong&gt; button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   |
   |------ Pay ₹50,000 ------&amp;gt;
   |
Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server starts processing your payment.&lt;/p&gt;

&lt;p&gt;But suddenly...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your internet becomes slow.&lt;/li&gt;
&lt;li&gt;The server successfully processes the payment.&lt;/li&gt;
&lt;li&gt;The response never reaches your phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now your app thinks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Maybe the payment failed."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So it retries automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client

Pay ₹50,000
------------&amp;gt;

(No response)

Retry
------------&amp;gt;

Retry Again
------------&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the server receives &lt;strong&gt;three identical requests&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  ❌ Without Idempotency
&lt;/h1&gt;

&lt;p&gt;The backend processes every request independently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request 1
Charge ₹50,000 ✅

Request 2
Charge ₹50,000 ✅

Request 3
Charge ₹50,000 ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer Paid ₹150,000 ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though the customer clicked &lt;strong&gt;only once&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is one of the biggest problems backend systems need to solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Do Duplicate Requests Happen?
&lt;/h2&gt;

&lt;p&gt;Duplicate requests happen all the time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User double-clicks the button.&lt;/li&gt;
&lt;li&gt;Internet connection becomes slow.&lt;/li&gt;
&lt;li&gt;Mobile network reconnects.&lt;/li&gt;
&lt;li&gt;Browser refreshes.&lt;/li&gt;
&lt;li&gt;HTTP client automatically retries.&lt;/li&gt;
&lt;li&gt;Load balancer retries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your backend &lt;strong&gt;must&lt;/strong&gt; handle these situations safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ The Solution: Idempotency
&lt;/h2&gt;

&lt;p&gt;Idempotency simply means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sending the same request multiple times should have the same effect as sending it once.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The backend should process the request only once.&lt;/p&gt;

&lt;p&gt;Every duplicate request should simply return the previous response.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Does It Work?
&lt;/h2&gt;

&lt;p&gt;Every request carries a unique value called an &lt;strong&gt;Idempotency Key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments

Idempotency-Key: abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as a unique tracking number for a request.&lt;/p&gt;




&lt;h2&gt;
  
  
  First Request
&lt;/h2&gt;

&lt;p&gt;The frontend sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments

Idempotency-Key: abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backend receives it.&lt;/p&gt;

&lt;p&gt;It asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Have I seen "abc123" before?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since it's a new request, the backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charges the customer&lt;/li&gt;
&lt;li&gt;Creates the order&lt;/li&gt;
&lt;li&gt;Stores the key&lt;/li&gt;
&lt;li&gt;Stores the response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Key        Response
-----------------------------
abc123     Payment Successful
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally it returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Retry Happens
&lt;/h2&gt;

&lt;p&gt;Because of a network timeout, the client retries.&lt;/p&gt;

&lt;p&gt;It sends &lt;strong&gt;the same key&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments

Idempotency-Key: abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backend checks again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Have I seen abc123?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YES ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of charging again...&lt;/p&gt;

&lt;p&gt;The backend simply returns the stored response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No duplicate payment.&lt;/p&gt;

&lt;p&gt;No duplicate order.&lt;/p&gt;

&lt;p&gt;No duplicate database entries.&lt;/p&gt;




&lt;h1&gt;
  
  
  Visual Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                First Request

Client
   |
   | Pay ₹1000
   | Key = abc123
   |
   v

Server

Have I seen abc123?

        |
      No |
        |

Process Payment

Save

abc123 -&amp;gt; Payment Success

Return Response

----------------------------------------

              Retry

Client
   |
   | Pay ₹1000
   | Key = abc123
   |
   v

Server

Have I seen abc123?

        |
      Yes
        |

Return Stored Response

(No Payment Again)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Who Generates the Idempotency Key?
&lt;/h1&gt;

&lt;p&gt;Usually, the &lt;strong&gt;frontend&lt;/strong&gt; (React, Angular, iOS, Android, etc.) generates it.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This key is attached to the request.&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚠️ A Common Beginner Mistake
&lt;/h1&gt;

&lt;p&gt;Many people think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If the request fails, I'll generate another key."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's wrong.&lt;/p&gt;

&lt;p&gt;Suppose the first request uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The retry uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xyz999
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend sees two completely different keys.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abc123 ❌

xyz999 ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It thinks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"These are two different payment requests."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So it charges twice.&lt;/p&gt;

&lt;p&gt;Idempotency completely fails.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ The Correct Way
&lt;/h1&gt;

&lt;p&gt;Generate the key &lt;strong&gt;once&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reuse it for every retry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Retry with SAME key&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice something?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is executed only once.&lt;/p&gt;




&lt;h1&gt;
  
  
  Frontend Example
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Generate only ONCE&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retrying...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Retry using SAME key&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/payment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;

        &lt;span class="p"&gt;},&lt;/span&gt;

        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

            &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;

        &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Backend Pseudo Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/payment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Have we already processed this request?
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# First time seeing this request
&lt;/span&gt;
    &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;charge_customer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire idea behind idempotency.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where Is the Key Stored?
&lt;/h1&gt;

&lt;p&gt;Usually in a database.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------------------+
| Idempotency Table                      |
+----------------------------------------+

Key           Response

------------------------------------------

abc123        Order #101

xyz456        Order #102

mno888        Payment Failed

------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many production systems use &lt;strong&gt;Redis&lt;/strong&gt; because it's much faster than querying a database.&lt;/p&gt;




&lt;h1&gt;
  
  
  Which HTTP Methods Need Idempotency?
&lt;/h1&gt;

&lt;h3&gt;
  
  
  GET
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already idempotent.&lt;/p&gt;

&lt;p&gt;Calling it 100 times doesn't change anything.&lt;/p&gt;




&lt;h3&gt;
  
  
  PUT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;PUT /users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Updating the same resource multiple times results in the same final state.&lt;/p&gt;

&lt;p&gt;Already idempotent.&lt;/p&gt;




&lt;h3&gt;
  
  
  DELETE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deleting an already deleted resource still leaves the system in the same state.&lt;/p&gt;

&lt;p&gt;Also idempotent.&lt;/p&gt;




&lt;h3&gt;
  
  
  POST
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;POST usually creates a new resource.&lt;/p&gt;

&lt;p&gt;Calling it multiple times creates multiple records.&lt;/p&gt;

&lt;p&gt;That's why POST endpoints commonly use &lt;strong&gt;Idempotency Keys&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where Is Idempotency Used?
&lt;/h1&gt;

&lt;p&gt;Almost every payment platform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe&lt;/li&gt;
&lt;li&gt;Razorpay&lt;/li&gt;
&lt;li&gt;PayPal&lt;/li&gt;
&lt;li&gt;PhonePe&lt;/li&gt;
&lt;li&gt;Google Pay&lt;/li&gt;
&lt;li&gt;Amazon Pay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's also widely used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order Creation&lt;/li&gt;
&lt;li&gt;Flight Booking&lt;/li&gt;
&lt;li&gt;Hotel Booking&lt;/li&gt;
&lt;li&gt;Wallet Recharge&lt;/li&gt;
&lt;li&gt;Subscription Creation&lt;/li&gt;
&lt;li&gt;Invoice Generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically...&lt;/p&gt;

&lt;p&gt;Anywhere duplicate processing would cause serious problems.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real-Life Analogy
&lt;/h1&gt;

&lt;p&gt;Imagine you're ordering pizza.&lt;/p&gt;

&lt;p&gt;You call the restaurant.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"One Large Pizza."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The phone disconnects.&lt;/p&gt;

&lt;p&gt;You don't know whether they heard you.&lt;/p&gt;

&lt;p&gt;You call again.&lt;/p&gt;

&lt;p&gt;Without idempotency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pizza
Pizza
Pizza
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three pizzas arrive.&lt;/p&gt;

&lt;p&gt;With idempotency:&lt;/p&gt;

&lt;p&gt;The restaurant checks your order number.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We've already received Order #123."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No new pizza is prepared.&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Takeaways
&lt;/h1&gt;

&lt;p&gt;✅ One business operation = One Idempotency Key&lt;/p&gt;

&lt;p&gt;✅ Every retry uses the same key&lt;/p&gt;

&lt;p&gt;✅ The backend stores the key after processing&lt;/p&gt;

&lt;p&gt;✅ Duplicate requests return the previous response&lt;/p&gt;

&lt;p&gt;✅ No duplicate payments&lt;/p&gt;

&lt;p&gt;✅ No duplicate orders&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Idempotency is one of those backend concepts users never notice—but they benefit from it every day.&lt;/p&gt;

&lt;p&gt;The next time your payment succeeds after a network timeout, or you don't get charged twice after accidentally clicking &lt;strong&gt;Pay&lt;/strong&gt; multiple times, you'll know there's an idempotency mechanism working behind the scenes.&lt;/p&gt;

&lt;p&gt;Good backend systems aren't just about making things work.&lt;/p&gt;

&lt;p&gt;They're about making sure they &lt;strong&gt;can't accidentally work twice.&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>backend</category>
      <category>stripe</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>## JavaScript Async vs Python AsyncIO — The Simplest Explanation for JavaScript Developers</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:28:09 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-javascript-async-vs-python-asyncio-the-simplest-explanation-for-javascript-developers-1agp</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-javascript-async-vs-python-asyncio-the-simplest-explanation-for-javascript-developers-1agp</guid>
      <description>&lt;p&gt;If you're coming from JavaScript, Python's &lt;code&gt;asyncio&lt;/code&gt; can feel confusing.&lt;/p&gt;

&lt;p&gt;I had the same question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why do I need &lt;code&gt;asyncio&lt;/code&gt;? JavaScript never makes me import anything."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After understanding both, I realized the concepts are almost the same.&lt;/p&gt;

&lt;p&gt;The biggest difference is &lt;strong&gt;who provides the event loop&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  JavaScript
&lt;/h1&gt;

&lt;p&gt;In JavaScript, the runtime (Browser or Node.js) already provides an event loop.&lt;/p&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Before&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before

(fetch request sent)

JavaScript Event Loop

↓

Runs other work while waiting

↓

API responds

↓

After
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You never think about the event loop because it already exists.&lt;/p&gt;

&lt;p&gt;The Browser (or Node.js) manages everything for you.&lt;/p&gt;




&lt;h1&gt;
  
  
  Python
&lt;/h1&gt;

&lt;p&gt;Now let's write the same thing in Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Before&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;After&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks very similar.&lt;/p&gt;

&lt;p&gt;The difference is:&lt;/p&gt;

&lt;p&gt;Instead of the Browser/Node.js providing the event loop automatically,&lt;/p&gt;

&lt;p&gt;Python uses &lt;strong&gt;asyncio&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function
        ↓
await
        ↓
asyncio Event Loop
        ↓
Network request
        ↓
Resume coroutine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  The Biggest Difference
&lt;/h1&gt;

&lt;p&gt;This is the one thing every JavaScript developer should remember.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;

&lt;p&gt;Calling an async function starts it immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Python
&lt;/h2&gt;

&lt;p&gt;Calling an async function does &lt;strong&gt;NOT&lt;/strong&gt; execute it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nothing

RuntimeWarning:
coroutine 'hello' was never awaited
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because Python only creates a &lt;strong&gt;coroutine object&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To execute it, you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  await Works Almost the Same
&lt;/h1&gt;

&lt;p&gt;JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In both languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The current function pauses.&lt;/li&gt;
&lt;li&gt;The event loop continues doing other work.&lt;/li&gt;
&lt;li&gt;When the API responds, execution resumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you already understand JavaScript's &lt;code&gt;await&lt;/code&gt;, you already understand most of Python's &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Does asyncio.create_task() Mean?
&lt;/h1&gt;

&lt;p&gt;Suppose sending an email takes 5 seconds.&lt;/p&gt;

&lt;p&gt;You don't want your user to wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Don't await&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Created&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The email starts in the background while the response is returned immediately.&lt;/p&gt;




&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;save_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User Created&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exactly the same idea.&lt;/p&gt;

&lt;p&gt;The difference is that Python explicitly asks the event loop to schedule the coroutine.&lt;/p&gt;




&lt;h1&gt;
  
  
  When Should You Use await?
&lt;/h1&gt;

&lt;p&gt;If the next line depends on the result, use &lt;code&gt;await&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;save_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database queries&lt;/li&gt;
&lt;li&gt;API calls&lt;/li&gt;
&lt;li&gt;Reading files asynchronously&lt;/li&gt;
&lt;li&gt;Cache lookups&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  When Should You Use create_task()?
&lt;/h1&gt;

&lt;p&gt;Use it only for background work.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send email&lt;/li&gt;
&lt;li&gt;Push notification&lt;/li&gt;
&lt;li&gt;Analytics event&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Cleanup jobs
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't wait for it.&lt;/p&gt;

&lt;p&gt;Continue immediately.&lt;/p&gt;




&lt;h1&gt;
  
  
  Don't Use Async for Everything
&lt;/h1&gt;

&lt;p&gt;This is another common mistake.&lt;/p&gt;

&lt;p&gt;Normal calculations don't need async.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;asyncio&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No event loop.&lt;/p&gt;

&lt;p&gt;Async is mainly useful for &lt;strong&gt;I/O-bound operations&lt;/strong&gt;, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP requests&lt;/li&gt;
&lt;li&gt;Database queries&lt;/li&gt;
&lt;li&gt;File I/O&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  JavaScript vs Python Cheat Sheet
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JavaScript&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;async function&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;async def&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;await fetch()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;await httpx.get()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser/Node.js Event Loop&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;asyncio&lt;/code&gt; Event Loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setTimeout()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;asyncio.sleep()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Promise&lt;/td&gt;
&lt;td&gt;Coroutine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sendEmail()&lt;/code&gt; (don't await)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;asyncio.create_task(send_email())&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Mental Model
&lt;/h1&gt;

&lt;p&gt;If you're coming from JavaScript, remember this sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JavaScript has a built-in event loop managed by the Browser or Node.js. Python exposes its event loop through the &lt;code&gt;asyncio&lt;/code&gt; library.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything else—&lt;code&gt;async&lt;/code&gt;, &lt;code&gt;await&lt;/code&gt;, pausing while waiting for I/O, and resuming execution—works very similarly.&lt;/p&gt;

&lt;p&gt;Once I stopped thinking of &lt;code&gt;asyncio&lt;/code&gt; as "something new" and instead saw it as Python's version of the JavaScript event loop, the whole concept became much easier to understand.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>python</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title># The Journey of a Request: How NGINX Routes Traffic Between Docker Containers in a Modern Web Application</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Wed, 15 Jul 2026 04:35:50 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-the-journey-of-a-request-how-nginx-routes-traffic-between-docker-containers-in-a-modern-web-47k0</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-the-journey-of-a-request-how-nginx-routes-traffic-between-docker-containers-in-a-modern-web-47k0</guid>
      <description>&lt;h2&gt;
  
  
  The Journey of a Request: From Browser to Database and Back
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered what actually happens after you type a website URL into your browser?&lt;/p&gt;

&lt;p&gt;Let's follow the complete journey of a request in a typical production web application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our Production Architecture
&lt;/h2&gt;

&lt;p&gt;Imagine we have four Docker containers running on the same server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                           Docker Network
┌─────────────────────────────────────────────────────────────────────┐
│                                                                     │
│                    ┌──────────────────┐                             │
│                    │      NGINX       │                             │
│                    │   (Port 80/443)  │                             │
│                    └────────┬─────────┘                             │
│                             │                                       │
│              ┌──────────────┴──────────────┐                        │
│              │                             │                        │
│              ▼                             ▼                        │
│      ┌───────────────┐             ┌───────────────┐                │
│      │   Frontend    │             │    Backend    │                │
│      │    :3000      │             │     :5000     │                │
│      └───────────────┘             └───────┬───────┘                │
│                                            │                        │
│                                            ▼                        │
│                                   ┌────────────────┐                │
│                                   │   PostgreSQL   │                │
│                                   │     :5432      │                │
│                                   └────────────────┘                │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

                    ▲
                    │
            Internet (Browser)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only &lt;strong&gt;NGINX&lt;/strong&gt; is exposed to the internet.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Frontend&lt;/strong&gt;, &lt;strong&gt;Backend&lt;/strong&gt;, and &lt;strong&gt;PostgreSQL&lt;/strong&gt; containers communicate over Docker's internal network. Users can never access these containers directly.&lt;/p&gt;

&lt;p&gt;A minimal NGINX reverse proxy configuration looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;myapp.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Website requests&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://frontend:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# API requests&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend:5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration tells NGINX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requests to &lt;code&gt;/&lt;/code&gt; should go to the &lt;strong&gt;Frontend&lt;/strong&gt; container.&lt;/li&gt;
&lt;li&gt;Requests beginning with &lt;code&gt;/api&lt;/code&gt; should go to the &lt;strong&gt;Backend&lt;/strong&gt; container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes NGINX the &lt;strong&gt;single entry point&lt;/strong&gt; for every incoming request.&lt;/p&gt;

&lt;p&gt;Now let's follow an actual request from start to finish.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: The User Opens the Website
&lt;/h2&gt;

&lt;p&gt;The user enters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://myapp.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser doesn't immediately know where this website is hosted.&lt;/p&gt;

&lt;p&gt;It first asks the &lt;strong&gt;DNS (Domain Name System)&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's the IP address for &lt;code&gt;myapp.com&lt;/code&gt;?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;DNS responds with the server's public IP address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
   │
   ▼
Browser
   │
DNS Lookup
   │
Returns Server IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the browser knows exactly where to send the request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: The Browser Sends the First Request
&lt;/h2&gt;

&lt;p&gt;The browser sends its first HTTP request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request reaches the server.&lt;/p&gt;

&lt;p&gt;Since only &lt;strong&gt;NGINX&lt;/strong&gt; is exposed to the internet, it receives every incoming request first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
    │
GET /
    │
NGINX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of NGINX as the receptionist of a company.&lt;/p&gt;

&lt;p&gt;Every visitor first speaks to the receptionist before being directed to the correct department.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: NGINX Routes the Request to the Frontend
&lt;/h2&gt;

&lt;p&gt;NGINX examines the request.&lt;/p&gt;

&lt;p&gt;Since the request is for &lt;code&gt;/&lt;/code&gt;, it forwards it to the frontend application (for example, React, Angular, Vue, or Next.js).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
     │
NGINX
     │
Frontend Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Fonts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NGINX sends these files back to the browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: The Browser Builds the User Interface
&lt;/h2&gt;

&lt;p&gt;The browser downloads all the assets.&lt;/p&gt;

&lt;p&gt;It parses the HTML, loads the CSS, executes the JavaScript, and finally renders the application on the screen.&lt;/p&gt;

&lt;p&gt;At this point, the user can interact with the application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: The User Clicks a Button
&lt;/h2&gt;

&lt;p&gt;Suppose the user clicks &lt;strong&gt;Login&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Or opens the &lt;strong&gt;Users&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;Or clicks &lt;strong&gt;View Profile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The frontend now needs data from the backend.&lt;/p&gt;

&lt;p&gt;Instead of contacting the backend directly, it makes an API request like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/login
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;The browser sends the request to the &lt;strong&gt;same domain&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://myapp.com/api/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; know anything about internal services such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend:5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those names exist only inside Docker's private network.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: NGINX Routes the API Request
&lt;/h2&gt;

&lt;p&gt;The API request once again reaches NGINX.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
     │
GET /api/users
     │
NGINX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NGINX recognizes that the request begins with &lt;code&gt;/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead of sending it to the frontend, it forwards it internally to the backend application (for example, Express, NestJS, Spring Boot, Django, ASP.NET Core).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
      │
NGINX
      │
Backend Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser never communicates directly with the backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: The Backend Processes the Request
&lt;/h2&gt;

&lt;p&gt;Inside the backend, the request flows through different layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   │
Controller / Route Handler
   │
Service Layer
   │
Repository / ORM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer has its own responsibility.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Controller / Route Handler&lt;/strong&gt; receives the HTTP request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Layer&lt;/strong&gt; contains the business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository / ORM&lt;/strong&gt; communicates with the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation of concerns makes applications easier to maintain, test, and scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: The ORM Talks to the Database
&lt;/h2&gt;

&lt;p&gt;Instead of writing raw SQL everywhere, most modern applications use an ORM (such as Prisma, Hibernate, Sequelize, SQLAlchemy, or Entity Framework).&lt;/p&gt;

&lt;p&gt;The ORM converts application code into SQL queries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application Code
       │
       ▼
ORM
       │
       ▼
SQL Query
       │
       ▼
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database executes the SQL query and returns the requested data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: The Response Begins Its Journey Back
&lt;/h2&gt;

&lt;p&gt;The database sends the result back to the ORM.&lt;/p&gt;

&lt;p&gt;The ORM returns it to the Service.&lt;/p&gt;

&lt;p&gt;The Service returns it to the Controller.&lt;/p&gt;

&lt;p&gt;The Controller creates the HTTP response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
      │
ORM
      │
Service
      │
Controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend has now finished processing the request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: NGINX Sends the Response Back
&lt;/h2&gt;

&lt;p&gt;The backend sends its response back to NGINX.&lt;/p&gt;

&lt;p&gt;NGINX forwards it to the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backend
     │
NGINX
     │
Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser receives the JSON response.&lt;/p&gt;

&lt;p&gt;The frontend updates the UI automatically, and the user sees the latest data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Journey
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 │
 ▼
Browser
 │
 ▼
DNS Lookup
 │
 ▼
Server IP Address
 │
 ▼
NGINX (Reverse Proxy)
 │
 ├────────────────────────► Frontend Application
 │                               │
 │◄────── HTML / CSS / JS ───────┘
 │
 ▼
Browser Renders UI
 │
 ▼
User Clicks Button
 │
 ▼
GET /api/... or POST /api/...
 │
 ▼
NGINX
 │
 ▼
Backend Application
 │
 ▼
Controller / Route Handler
 │
 ▼
Service Layer
 │
 ▼
Repository / ORM
 │
 ▼
Database
 │
 ▲
ORM
 │
 ▲
Service
 │
 ▲
Controller
 │
 ▲
NGINX
 │
 ▲
Browser
 │
 ▲
Frontend Updates UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DNS only tells the browser where the server is located.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGINX is the single public entry point for every request.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGINX decides whether a request should go to the Frontend or the Backend.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The browser never communicates directly with backend services or the database.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend services communicate with the database over Docker's private network.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The response follows the exact same path back to the browser.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you understand this request journey, modern production architectures become much easier to reason about. Whether you're using React, Angular, Vue, Express, Spring Boot, Django, or any other framework, the overall request lifecycle remains fundamentally the same.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>docker</category>
      <category>networking</category>
    </item>
    <item>
      <title>What is API Versioning?</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Thu, 02 Jul 2026 10:52:34 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/what-is-api-versioning-53ce</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/what-is-api-versioning-53ce</guid>
      <description>&lt;h1&gt;
  
  
  🚀 What is API Versioning? (Beginner Friendly)
&lt;/h1&gt;

&lt;p&gt;If you're learning backend development, you've probably seen APIs like these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/users
GET /api/v2/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first question most beginners ask is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why do we need &lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;v2&lt;/code&gt;, or &lt;code&gt;v3&lt;/code&gt;? Why not just update the existing API?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's understand it with a simple example.&lt;/p&gt;




&lt;h1&gt;
  
  
  📖 What is API Versioning?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;API Versioning&lt;/strong&gt; is a way to make changes to an API &lt;strong&gt;without breaking applications that are already using it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of changing the existing API, developers create a &lt;strong&gt;new version&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧑‍💻 Example
&lt;/h1&gt;

&lt;p&gt;Suppose you have an API like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version 1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/user
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roshan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything works perfectly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 A Few Months Later...
&lt;/h2&gt;

&lt;p&gt;Your company decides that &lt;strong&gt;age should no longer be public&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your first thought might be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why not just remove &lt;code&gt;age&lt;/code&gt; from Version 1?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because thousands of applications might already be using this API.&lt;/p&gt;

&lt;p&gt;For example, an old mobile app expects this response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roshan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you suddenly change the API to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roshan"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the old app may stop working because it was expecting the &lt;code&gt;age&lt;/code&gt; field.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ The Solution: Create a New Version
&lt;/h1&gt;

&lt;p&gt;Instead of modifying &lt;strong&gt;v1&lt;/strong&gt;, create &lt;strong&gt;v2&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version 2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v2/user
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roshan"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now both versions exist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/v1/user  → Returns name + age
/api/v2/user  → Returns only name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Old applications continue using &lt;strong&gt;v1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ New applications use &lt;strong&gt;v2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Nothing breaks&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ❓But Won't Old Users Keep Using v1 Forever?
&lt;/h1&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Here's what usually happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1
&lt;/h3&gt;

&lt;p&gt;The old version of your app calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2
&lt;/h3&gt;

&lt;p&gt;You release a new version of your app.&lt;/p&gt;

&lt;p&gt;Inside the new app, you change the API call to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v2/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3
&lt;/h3&gt;

&lt;p&gt;Users update the app from the Play Store or App Store.&lt;/p&gt;

&lt;p&gt;After updating, the app automatically starts using &lt;strong&gt;v2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Users don't need to change anything manually.&lt;/p&gt;




&lt;h1&gt;
  
  
  👴 What About Users Who Never Update?
&lt;/h1&gt;

&lt;p&gt;For some time, they continue using &lt;strong&gt;v1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's why companies keep older API versions running.&lt;/p&gt;

&lt;p&gt;A typical lifecycle looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Release v1
      │
      ▼
Users start using it
      │
      ▼
Release v2
      │
      ▼
New app uses v2
      │
      ▼
Most users update
      │
      ▼
Announce v1 is deprecated
      │
      ▼
Remove v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keeping an old version for some time before removing it is called &lt;strong&gt;API Deprecation&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎯 Why is API Versioning Important?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Prevents existing applications from breaking.&lt;/li&gt;
&lt;li&gt;Allows developers to improve the API safely.&lt;/li&gt;
&lt;li&gt;Gives users time to update their applications.&lt;/li&gt;
&lt;li&gt;Makes it easier to add new features in the future.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  📝 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Think of API versions like software versions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v1&lt;/strong&gt; → Old version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2&lt;/strong&gt; → Improved version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3&lt;/strong&gt; → Latest version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Older applications continue using the version they were built for, while newer applications use the latest version.&lt;/p&gt;

&lt;p&gt;That's why you'll often see APIs like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/users
GET /api/v2/users
GET /api/v3/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;API Versioning allows your API to evolve without breaking existing applications.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>backenddevelopment</category>
      <category>api</category>
    </item>
    <item>
      <title># Webhook vs Polling — Understanding with Real Examples</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Mon, 29 Jun 2026 04:26:27 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-webhook-vs-polling-understanding-with-real-examples-39p6</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-webhook-vs-polling-understanding-with-real-examples-39p6</guid>
      <description>&lt;p&gt;When I first started learning backend development, I kept hearing two terms everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polling&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first they sounded complicated, but the core idea is simple.&lt;/p&gt;

&lt;p&gt;Both are ways for one system to get updates from another system.&lt;/p&gt;

&lt;p&gt;The difference is &lt;strong&gt;who starts the communication&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Polling?
&lt;/h2&gt;

&lt;p&gt;Polling means your application repeatedly asks another server for updates.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Any new updates?”&lt;br&gt;
“Any updates now?”&lt;br&gt;
“What about now?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the client checks every 5 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-life Example of Polling
&lt;/h2&gt;

&lt;p&gt;Think about checking your job application status on a company portal.&lt;/p&gt;

&lt;p&gt;You log in and see:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Under Review&lt;/p&gt;

&lt;p&gt;After 3 days, you refresh the page.&lt;/p&gt;

&lt;p&gt;Your browser sends another API request asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Has my application status changed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That refresh is basically &lt;strong&gt;manual polling&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Polling Can Be Inefficient
&lt;/h2&gt;

&lt;p&gt;Polling is easy to implement, but there’s a problem.&lt;/p&gt;

&lt;p&gt;What if nothing changes for hours?&lt;/p&gt;

&lt;p&gt;Your application still keeps sending requests.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra server load&lt;/li&gt;
&lt;li&gt;Unnecessary network calls&lt;/li&gt;
&lt;li&gt;Wasted resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine 50,000 users checking every few seconds.&lt;/p&gt;

&lt;p&gt;That becomes expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Webhook?
&lt;/h2&gt;

&lt;p&gt;Webhook solves this problem.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly asking for updates, you provide your server URL to another service.&lt;/p&gt;

&lt;p&gt;When something happens, that service sends data automatically.&lt;/p&gt;

&lt;p&gt;In simple words:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t ask me repeatedly — I’ll notify you when something changes.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-life Example of Webhook
&lt;/h2&gt;

&lt;p&gt;Payment systems are the best example.&lt;/p&gt;

&lt;p&gt;Suppose a customer pays using Stripe or Razorpay.&lt;/p&gt;

&lt;p&gt;Without webhooks, your backend keeps asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Payment successful?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With webhooks, the payment provider instantly sends a request to your server.&lt;/p&gt;

&lt;p&gt;Example payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment.success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your backend can then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mark order as paid&lt;/li&gt;
&lt;li&gt;Generate invoice&lt;/li&gt;
&lt;li&gt;Send confirmation email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Polling vs Webhook
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Polling&lt;/th&gt;
&lt;th&gt;Webhook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Client asks repeatedly&lt;/td&gt;
&lt;td&gt;Server pushes updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Delayed&lt;/td&gt;
&lt;td&gt;Near real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests&lt;/td&gt;
&lt;td&gt;More&lt;/td&gt;
&lt;td&gt;Less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Better&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Simple Analogy
&lt;/h2&gt;

&lt;p&gt;Imagine ordering food.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polling
&lt;/h3&gt;

&lt;p&gt;You call the restaurant every 5 minutes:&lt;/p&gt;

&lt;p&gt;“Is my food ready?”&lt;/p&gt;

&lt;h3&gt;
  
  
  Webhook
&lt;/h3&gt;

&lt;p&gt;Restaurant calls you when food is ready.&lt;/p&gt;

&lt;p&gt;That’s the difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;Polling&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data changes slowly&lt;/li&gt;
&lt;li&gt;Simplicity matters&lt;/li&gt;
&lt;li&gt;Real-time updates are not required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;strong&gt;Webhooks&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Events happen unpredictably&lt;/li&gt;
&lt;li&gt;Instant updates matter&lt;/li&gt;
&lt;li&gt;Scalability is important&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Polling is pull-based communication.&lt;br&gt;&lt;br&gt;
Webhooks are push-based communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  backend #webdev #systemdesign #javascript #nodejs
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>webhook</category>
    </item>
    <item>
      <title>LLD Design Process (From Requirements to Code)</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Fri, 19 Jun 2026 04:51:06 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/lld-design-process-from-requirements-to-code-594m</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/lld-design-process-from-requirements-to-code-594m</guid>
      <description>&lt;h1&gt;
  
  
  LLD Design Process (From Requirements to Code)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1: Understand Requirements
&lt;/h2&gt;

&lt;p&gt;Before creating any class, understand what the system should do.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What features are required?&lt;/li&gt;
&lt;li&gt;What operations are supported?&lt;/li&gt;
&lt;li&gt;What are the future extensions?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Document Editor
&lt;/h3&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add Text&lt;/li&gt;
&lt;li&gt;Add Image&lt;/li&gt;
&lt;li&gt;Add New Line&lt;/li&gt;
&lt;li&gt;Add Tab Space&lt;/li&gt;
&lt;li&gt;Render Document&lt;/li&gt;
&lt;li&gt;Save Document&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Never jump directly to classes.&lt;/p&gt;

&lt;p&gt;First understand the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Extract Nouns → Classes
&lt;/h2&gt;

&lt;p&gt;Nouns in requirements often become classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Text&lt;/li&gt;
&lt;li&gt;Add Image&lt;/li&gt;
&lt;li&gt;Save Document&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nouns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document&lt;/li&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;li&gt;Image&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Possible classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document
TextElement
ImageElement
Storage
DocumentEditor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Another Example (Parking Lot)
&lt;/h3&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Park Vehicle&lt;/li&gt;
&lt;li&gt;Generate Ticket&lt;/li&gt;
&lt;li&gt;Multiple Floors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nouns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ParkingLot
Floor
Slot
Vehicle
Ticket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These become candidate classes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Find IS-A Relationships → Inheritance
&lt;/h2&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;"Can I say child IS-A parent?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextElement IS-A DocumentElement
ImageElement IS-A DocumentElement
NewLineElement IS-A DocumentElement
TabSpaceElement IS-A DocumentElement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                DocumentElement
                        ▲
                        |
       ----------------------------------
       |         |          |           |
 TextElement ImageElement NewLineElement TabSpaceElement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextElement&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImageElement&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rule
&lt;/h3&gt;

&lt;p&gt;Use inheritance only when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Child IS-A Parent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car IS-A Vehicle
Dog IS-A Animal
CreditCardPayment IS-A Payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Find HAS-A Relationships → Composition/Aggregation
&lt;/h2&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;"What objects are contained inside another object?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;A document contains elements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DocumentElement&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;documentElements&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document HAS-A collection of DocumentElements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document 1 -------- * DocumentElement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Another Example
&lt;/h3&gt;

&lt;p&gt;Parking Lot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ParkingLot HAS-A Floors
Floor HAS-A Slots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rule
&lt;/h3&gt;

&lt;p&gt;Use composition/aggregation when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parent HAS-A Child
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car HAS-A Engine
Document HAS-A Elements
ParkingLot HAS-A Floors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Identify Actions → Methods
&lt;/h2&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;"What actions can objects perform?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Document Editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add Text
Add Image
Render
Save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;addImage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parking Lot
&lt;/h3&gt;

&lt;p&gt;Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parkVehicle()
unparkVehicle()
generateTicket()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;parkVehicle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;unparkVehicle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rule
&lt;/h3&gt;

&lt;p&gt;Verbs become methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nouns → Classes
Verbs → Methods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Find Variations → Interfaces / Abstract Classes
&lt;/h2&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;"What can change in the future?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Saving document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File
Database
Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are different implementations.&lt;/p&gt;

&lt;p&gt;Create abstraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Persistence
                   ▲
                   |
         --------------------
         |                  |
   FileStorage        DBStorage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Persistence&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;Tomorrow we can add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CloudStorage&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Persistence&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without changing existing code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule
&lt;/h3&gt;

&lt;p&gt;When multiple implementations exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create Interface / Abstract Class
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment
 ├─ UPI
 ├─ Card
 └─ Cash

Storage
 ├─ File
 ├─ DB
 └─ Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7: Draw UML
&lt;/h2&gt;

&lt;p&gt;After identifying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Inheritance&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Draw UML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document
    |
    | contains
    v
DocumentElement
      ▲
      |
-----------------------
|         |           |
Text    Image     NewLine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Persistence
      ▲
      |
---------------
|             |
FileStorage DBStorage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 8: Write Code
&lt;/h2&gt;

&lt;p&gt;Convert UML to code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Abstract Class
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Child Classes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextElement&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImageElement&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DocumentElement&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Composition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DocumentElement&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dependency Injection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DocumentEditor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;Persistence&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Interview Thinking Framework
&lt;/h1&gt;

&lt;p&gt;Whenever interviewer gives a problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requirements
      ↓
Nouns
      ↓
Classes
      ↓
IS-A
      ↓
Inheritance
      ↓
HAS-A
      ↓
Composition
      ↓
Verbs
      ↓
Methods
      ↓
Variations
      ↓
Interfaces
      ↓
UML
      ↓
Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Quick Cheat Sheet
&lt;/h1&gt;

&lt;p&gt;Noun → Class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vehicle
Ticket
Document
User
Payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verb → Method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;park()
save()
render()
pay()
login()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IS-A → Inheritance&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car IS-A Vehicle
ImageElement IS-A DocumentElement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HAS-A → Composition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car HAS-A Engine
Document HAS-A Elements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Future Variations → Interface&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment
Storage
Notification
Logger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final Flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requirements
   ↓
Classes
   ↓
Inheritance
   ↓
Composition
   ↓
Methods
   ↓
Interfaces
   ↓
UML
   ↓
Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>lld</category>
      <category>systemdesign</category>
      <category>interview</category>
      <category>webdev</category>
    </item>
    <item>
      <title># 🚀 Important React Interview Questions Every Developer Must Know</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Fri, 08 May 2026 06:28:56 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-important-react-interview-questions-every-developer-must-know-26fp</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-important-react-interview-questions-every-developer-must-know-26fp</guid>
      <description>&lt;p&gt;If you're preparing for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React interviews&lt;/li&gt;
&lt;li&gt;frontend roles&lt;/li&gt;
&lt;li&gt;full stack interviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;these are the &lt;strong&gt;most important React concepts&lt;/strong&gt; you should know.&lt;/p&gt;

&lt;p&gt;This guide covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;core React fundamentals&lt;/li&gt;
&lt;li&gt;hooks&lt;/li&gt;
&lt;li&gt;rendering&lt;/li&gt;
&lt;li&gt;state management&lt;/li&gt;
&lt;li&gt;optimization concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;in a beginner-friendly way.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ 1. What is Virtual DOM?
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Virtual DOM&lt;/strong&gt; is a lightweight JavaScript copy of the real DOM.&lt;/p&gt;

&lt;p&gt;Instead of directly updating the browser DOM:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;React creates a new Virtual DOM&lt;/li&gt;
&lt;li&gt;compares it with the old one&lt;/li&gt;
&lt;li&gt;updates only changed parts in the real DOM&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process is called:&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚡ Reconciliation / Diffing
&lt;/h1&gt;




&lt;h2&gt;
  
  
  ✅ Why is Virtual DOM Fast?
&lt;/h2&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comparing JavaScript objects is fast&lt;/li&gt;
&lt;li&gt;real DOM operations are expensive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React minimizes direct DOM manipulation.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ 2. What is useState?
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;useState&lt;/code&gt; is a React Hook used for managing component state.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```jsx id="jlwmn"&lt;br&gt;
const [count, setCount] = useState(0);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


* `count` → current state
* `setCount` → updates state

When state changes:

# React re-renders the component

---

# ✅ 3. What is useEffect?

`useEffect` handles:

* API calls
* timers
* subscriptions
* event listeners
* side effects



```jsx id="jlwmm"
useEffect(() =&amp;gt; {
  fetchData();
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Important Point
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useEffect&lt;/code&gt; runs:&lt;/p&gt;
&lt;h1&gt;
  
  
  AFTER component render
&lt;/h1&gt;


&lt;h2&gt;
  
  
  ✅ Dependency Array
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dependency&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No array&lt;/td&gt;
&lt;td&gt;Runs every render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[count]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs when count changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  ✅ 4. Props vs State
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Props&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Passed from parent&lt;/td&gt;
&lt;td&gt;Managed inside component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;td&gt;Mutable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used for communication&lt;/td&gt;
&lt;td&gt;Used for dynamic data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  ✅ 5. What is Redux Toolkit?
&lt;/h1&gt;

&lt;p&gt;Redux Toolkit is used for:&lt;/p&gt;
&lt;h1&gt;
  
  
  Global State Management
&lt;/h1&gt;

&lt;p&gt;It helps avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prop drilling&lt;/li&gt;
&lt;li&gt;deeply nested state passing&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ✅ Main Concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Store&lt;/li&gt;
&lt;li&gt;Slice&lt;/li&gt;
&lt;li&gt;Reducer&lt;/li&gt;
&lt;li&gt;Dispatch&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  ✅ 6. What is RTK Query?
&lt;/h1&gt;

&lt;p&gt;RTK Query simplifies API integration in Redux Toolkit.&lt;/p&gt;

&lt;p&gt;It automatically handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caching&lt;/li&gt;
&lt;li&gt;loading state&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;refetching
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;```jsx id="jlwml"&lt;br&gt;
const { data } = useGetUsersQuery();&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ✅ 7. Component Lifecycle

React components have 3 lifecycle phases:

1. Mounting
2. Updating
3. Unmounting

Handled using `useEffect`.

---

## ✅ Mount Example



```jsx id="jlwmk"
useEffect(() =&amp;gt; {}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Cleanup Example
&lt;/h2&gt;



&lt;p&gt;```jsx id="jlwmj"&lt;br&gt;
useEffect(() =&amp;gt; {&lt;br&gt;
  return () =&amp;gt; {&lt;br&gt;
    console.log("cleanup");&lt;br&gt;
  };&lt;br&gt;
}, []);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ✅ 8. Controlled vs Uncontrolled Components

---

## ✅ Controlled Component

React controls input state.



```jsx id="jlwmi"
&amp;lt;input value={name} onChange={handleChange} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Uncontrolled Component
&lt;/h2&gt;

&lt;p&gt;DOM controls input using refs.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```jsx id="jlwmh"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ✅ 9. What is useRef?

`useRef` stores mutable values without causing re-renders.

Commonly used for:

* DOM access
* focusing inputs
* timers
* previous values



```jsx id="jlwmg"
const inputRef = useRef();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ✅ 10. API Integration in React
&lt;/h1&gt;

&lt;p&gt;Usually done using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;axios&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside &lt;code&gt;useEffect&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```jsx id="jlwmf"&lt;br&gt;
useEffect(() =&amp;gt; {&lt;br&gt;
  axios.get("/api/users");&lt;br&gt;
}, []);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ✅ fetch vs axios

| fetch               | axios                  |
| ------------------- | ---------------------- |
| Built into browser  | External library       |
| Manual JSON parsing | Automatic JSON parsing |
| More boilerplate    | Cleaner syntax         |

---

# ✅ 11. What is Lifting State Up?

Lifting state up means:

# Moving shared state to the nearest common parent component.

Used when sibling components need same data.

---

# ✅ Example



```jsx id="jlwme"
&amp;lt;ChildA count={count} /&amp;gt;
&amp;lt;ChildB setCount={setCount} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  ✅ 12. What is Context API?
&lt;/h1&gt;

&lt;p&gt;Context API helps avoid:&lt;/p&gt;
&lt;h1&gt;
  
  
  Prop Drilling
&lt;/h1&gt;

&lt;p&gt;It allows components to access shared data directly.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ Example
&lt;/h2&gt;



&lt;p&gt;```jsx id="jlwmd"&lt;br&gt;
const user = useContext(UserContext);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ✅ 13. What is React.memo?

`React.memo` prevents unnecessary component re-renders.

It uses:

# Shallow Prop Comparison



```jsx id="jlwmc"
export default React.memo(Child);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  ✅ 14. What is useMemo?
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; memoizes expensive calculations or values.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```jsx id="jlwmb"&lt;br&gt;
const value = useMemo(() =&amp;gt; calculate(), [dep]);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Recalculates only when dependencies change.

---

# ✅ 15. What is useCallback?

`useCallback` memoizes function references.



```jsx id="jlwma"
const handleClick = useCallback(() =&amp;gt; {}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helps prevent unnecessary child re-renders.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 Most Important React Optimization Concept
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt; alone is often NOT enough.&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;arrays&lt;/li&gt;
&lt;li&gt;objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;create new references every render.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useCallback&lt;/code&gt; preserves function reference&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useMemo&lt;/code&gt; preserves value reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helps:&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ React.memo work effectively
&lt;/h1&gt;




&lt;h1&gt;
  
  
  📊 Difference Between React.memo, useMemo, useCallback
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;React.memo&lt;/th&gt;
&lt;th&gt;useMemo&lt;/th&gt;
&lt;th&gt;useCallback&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Used For&lt;/td&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prevents&lt;/td&gt;
&lt;td&gt;Re-render&lt;/td&gt;
&lt;td&gt;Recalculation&lt;/td&gt;
&lt;td&gt;Function recreation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🎯 Final Interview Tips
&lt;/h1&gt;

&lt;p&gt;For React interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focus on concepts&lt;/li&gt;
&lt;li&gt;understand rendering&lt;/li&gt;
&lt;li&gt;know how hooks work internally&lt;/li&gt;
&lt;li&gt;explain WHY optimizations are needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most interviewers care more about:&lt;/p&gt;

&lt;h1&gt;
  
  
  understanding
&lt;/h1&gt;

&lt;p&gt;than memorizing syntax.&lt;/p&gt;




&lt;h1&gt;
  
  
  🏁 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;React becomes much easier once you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rendering&lt;/li&gt;
&lt;li&gt;component lifecycle&lt;/li&gt;
&lt;li&gt;state management&lt;/li&gt;
&lt;li&gt;memoization&lt;/li&gt;
&lt;li&gt;re-renders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Master these concepts properly and you’ll already know most of the important React interview topics.&lt;/p&gt;

</description>
      <category>interview</category>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React.memo vs useMemo vs useCallback — Complete Guide</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Fri, 08 May 2026 06:25:26 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/reactmemo-vs-usememo-vs-usecallback-complete-guide-5cdh</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/reactmemo-vs-usememo-vs-usecallback-complete-guide-5cdh</guid>
      <description>&lt;p&gt;If you're learning React, you've probably heard these terms everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;React.memo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useCallback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, they look confusing.&lt;/p&gt;

&lt;p&gt;But all three solve &lt;strong&gt;one major problem&lt;/strong&gt;:&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚡ &lt;strong&gt;Unnecessary Re-renders &amp;amp; Performance Issues&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This guide explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what each one does&lt;/li&gt;
&lt;li&gt;why they exist&lt;/li&gt;
&lt;li&gt;how they are connected&lt;/li&gt;
&lt;li&gt;when to use them&lt;/li&gt;
&lt;li&gt;interview explanations&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🤔 &lt;strong&gt;Why Do These Exist?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;In React, components re-render very frequently.&lt;/p&gt;

&lt;p&gt;A component re-renders when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;state changes&lt;/li&gt;
&lt;li&gt;props change&lt;/li&gt;
&lt;li&gt;parent component re-renders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time this is fine.&lt;/p&gt;

&lt;p&gt;But in large applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expensive calculations&lt;/li&gt;
&lt;li&gt;recreated functions&lt;/li&gt;
&lt;li&gt;unnecessary child renders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can slow down the application.&lt;/p&gt;

&lt;p&gt;That’s why React provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React.memo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;useMemo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;useCallback&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;for optimization.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 &lt;strong&gt;First Understand One Important Thing&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;In React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rendered&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever React re-renders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;ENTIRE component function runs again&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;variables get recreated&lt;/li&gt;
&lt;li&gt;functions get recreated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the root reason why memoization exists.&lt;/p&gt;




&lt;h1&gt;
  
  
  1️⃣ &lt;strong&gt;React.memo&lt;/strong&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;What is React.memo?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt; prevents unnecessary component re-renders.&lt;/p&gt;




&lt;h1&gt;
  
  
  ❌ &lt;strong&gt;Problem Without React.memo&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Child rendered&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Child Component&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Increment
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Child&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔍 &lt;strong&gt;What Happens Here?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;When button is clicked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parent re-renders&lt;/li&gt;
&lt;li&gt;Child ALSO re-renders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Child props didn't change&lt;/li&gt;
&lt;li&gt;Child state didn't change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;This is an unnecessary re-render.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;Solution Using React.memo&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Child rendered&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Child Component&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now React remembers the previous render.&lt;/p&gt;

&lt;p&gt;If props are unchanged:&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;Child render is skipped&lt;/strong&gt;
&lt;/h1&gt;




&lt;h1&gt;
  
  
  ⚙️ &lt;strong&gt;How React.memo Works Internally&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;React performs:&lt;/p&gt;

&lt;h1&gt;
  
  
  👉 &lt;strong&gt;Shallow Comparison&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;It compares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;old props&lt;/li&gt;
&lt;li&gt;new props&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If props are same:&lt;br&gt;
✅ React skips rendering.&lt;/p&gt;


&lt;h1&gt;
  
  
  📌 &lt;strong&gt;Important Point&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt; works best with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strings&lt;/li&gt;
&lt;li&gt;numbers&lt;/li&gt;
&lt;li&gt;booleans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But NOT always with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;arrays&lt;/li&gt;
&lt;li&gt;objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because they create new references every render.&lt;/p&gt;

&lt;p&gt;That’s where &lt;code&gt;useCallback&lt;/code&gt; and &lt;code&gt;useMemo&lt;/code&gt; help.&lt;/p&gt;


&lt;h1&gt;
  
  
  2️⃣ &lt;strong&gt;useCallback&lt;/strong&gt;
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;What is useCallback?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;useCallback&lt;/code&gt; memoizes functions.&lt;/p&gt;

&lt;p&gt;It prevents function recreation on every render.&lt;/p&gt;


&lt;h1&gt;
  
  
  ❌ &lt;strong&gt;Problem Without useCallback&lt;/strong&gt;
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Child&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Looks normal, right?&lt;/p&gt;

&lt;p&gt;But here's the hidden issue:&lt;/p&gt;
&lt;h1&gt;
  
  
  🚨 &lt;strong&gt;A NEW function gets created on every render&lt;/strong&gt;
&lt;/h1&gt;


&lt;h1&gt;
  
  
  🤯 &lt;strong&gt;Why?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Because in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;both functions have different memory references&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🚨 &lt;strong&gt;Why This Causes Re-renders&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Suppose Child uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Child rendered&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with &lt;code&gt;React.memo&lt;/code&gt;,&lt;br&gt;
Child STILL re-renders because:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;oldFunction&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;newFunction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React thinks:&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ &lt;strong&gt;Prop changed&lt;/strong&gt;
&lt;/h1&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;Solution Using useCallback&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now React stores:&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;SAME function reference&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;between renders.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Child gets same prop&lt;/li&gt;
&lt;li&gt;React.memo works properly&lt;/li&gt;
&lt;li&gt;unnecessary render avoided&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 &lt;strong&gt;Behind The Scenes&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ❌ &lt;strong&gt;Without useCallback&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;span class="nf"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;span class="nf"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;With useCallback&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;span class="nf"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;reuse&lt;/span&gt; &lt;span class="nx"&gt;same&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;span class="nf"&gt;Render&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;reuse&lt;/span&gt; &lt;span class="nx"&gt;same&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  3️⃣ &lt;strong&gt;useMemo&lt;/strong&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;What is useMemo?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; memoizes values or expensive calculations.&lt;/p&gt;




&lt;h1&gt;
  
  
  ❌ &lt;strong&gt;Problem Without useMemo&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs:&lt;/p&gt;

&lt;h1&gt;
  
  
  🚨 &lt;strong&gt;On EVERY render&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Even when unrelated state changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  🤯 &lt;strong&gt;Example&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;theme changes&lt;/li&gt;
&lt;li&gt;modal opens&lt;/li&gt;
&lt;li&gt;input typing happens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;runs again.&lt;/p&gt;

&lt;p&gt;For large data:&lt;br&gt;
❌ performance issue.&lt;/p&gt;


&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;Solution Using useMemo&lt;/strong&gt;
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now calculation runs ONLY when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚙️ &lt;strong&gt;How useMemo Works Internally&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;React stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;previous dependencies&lt;/li&gt;
&lt;li&gt;previous calculated value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If dependencies don't change:&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;Cached value is returned&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;No recalculation happens.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 &lt;strong&gt;MOST IMPORTANT — How All Three Are Connected&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This is where most beginners get confused.&lt;/p&gt;




&lt;h1&gt;
  
  
  ❌ &lt;strong&gt;React.memo Alone Is NOT Enough&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Child&lt;/span&gt;
  &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;filteredUsers&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with &lt;code&gt;React.memo&lt;/code&gt;,&lt;br&gt;
Child may STILL re-render because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;handleClick&lt;/code&gt; creates new function&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;filteredUsers&lt;/code&gt; creates new array/object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;oldProp&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;newProp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because references changed.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;That’s Why We Need:&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  👉 &lt;strong&gt;useCallback&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;to preserve function reference&lt;/p&gt;

&lt;p&gt;AND&lt;/p&gt;

&lt;h2&gt;
  
  
  👉 &lt;strong&gt;useMemo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;to preserve value/object/array reference&lt;/p&gt;

&lt;p&gt;So that:&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;React.memo can ACTUALLY skip rendering&lt;/strong&gt;
&lt;/h1&gt;




&lt;h1&gt;
  
  
  🧩 &lt;strong&gt;Simple Mental Model&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;React.memo&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Skip component render if props are same.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;useCallback&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Keep same function reference.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;useMemo&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Keep same calculated value/reference.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  📊 &lt;strong&gt;Final Difference Between All Three&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;React.memo&lt;/th&gt;
&lt;th&gt;useMemo&lt;/th&gt;
&lt;th&gt;useCallback&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Used For&lt;/td&gt;
&lt;td&gt;Component&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prevents&lt;/td&gt;
&lt;td&gt;Re-render&lt;/td&gt;
&lt;td&gt;Recalculation&lt;/td&gt;
&lt;td&gt;Function recreation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Returns&lt;/td&gt;
&lt;td&gt;Memoized component&lt;/td&gt;
&lt;td&gt;Memoized value&lt;/td&gt;
&lt;td&gt;Memoized function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common Use&lt;/td&gt;
&lt;td&gt;Child optimization&lt;/td&gt;
&lt;td&gt;Expensive calculations&lt;/td&gt;
&lt;td&gt;Stable callbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🚫 &lt;strong&gt;When NOT To Use Them&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Do NOT overuse memoization.&lt;/p&gt;

&lt;p&gt;These hooks also have overhead.&lt;/p&gt;

&lt;p&gt;Use them only when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unnecessary renders are causing issues&lt;/li&gt;
&lt;li&gt;calculations are expensive&lt;/li&gt;
&lt;li&gt;components are large/heavy&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🎯 &lt;strong&gt;Interview Summary&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;React.memo&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Prevents unnecessary component re-renders using shallow prop comparison.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;useMemo&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Memoizes calculated values and recalculates only when dependencies change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;useCallback&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Memoizes function references to prevent unnecessary function recreation and child re-renders.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🏁 &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Most developers memorize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syntax&lt;/li&gt;
&lt;li&gt;definitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the REAL understanding is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt; depends on stable references.&lt;br&gt;
&lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt; help maintain those stable references.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once this connection clicks, React rendering behavior becomes much easier to understand.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>performance</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Scaling Redis in Distributed Systems: From Local Cache Problems to Redis Cluster</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Wed, 06 May 2026 12:04:05 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/scaling-redis-in-distributed-systems-from-local-cache-problems-to-redis-cluster-37if</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/scaling-redis-in-distributed-systems-from-local-cache-problems-to-redis-cluster-37if</guid>
      <description>&lt;p&gt;**When building scalable backend systems, one common question arises:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If we scale our application using multiple instances, how should caching work?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This becomes especially important when using Redis in distributed architectures.&lt;/p&gt;

&lt;p&gt;Let’s understand the problem step by step and then move toward advanced scaling concepts like &lt;strong&gt;sharding&lt;/strong&gt; and &lt;strong&gt;replication&lt;/strong&gt;.**&lt;/p&gt;




&lt;h1&gt;
  
  
  🚨 The Problem with Local Redis per Instance
&lt;/h1&gt;

&lt;p&gt;Suppose we scale our backend application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load Balancer
     ↓
 ┌───────────┐
 │ Instance1 │
 └───────────┘
       │
   Local Redis 1

 ┌───────────┐
 │ Instance2 │
 └───────────┘
       │
   Local Redis 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this looks fine.&lt;/p&gt;

&lt;p&gt;But here’s the issue.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User data gets updated through &lt;strong&gt;Instance 2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Local Redis 2 gets updated&lt;/li&gt;
&lt;li&gt;Local Redis 1 still contains old cached data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requests routed to Instance 1 return stale data&lt;/li&gt;
&lt;li&gt;Requests routed to Instance 2 return fresh data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache inconsistency&lt;/li&gt;
&lt;li&gt;Synchronization complexity&lt;/li&gt;
&lt;li&gt;Stale reads&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ❌ Why Syncing Local Redis is Difficult
&lt;/h1&gt;

&lt;p&gt;To keep multiple local Redis caches synchronized, we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pub/Sub systems&lt;/li&gt;
&lt;li&gt;Event broadcasting&lt;/li&gt;
&lt;li&gt;Cache invalidation messaging&lt;/li&gt;
&lt;li&gt;Distributed coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes very complex at scale.&lt;/p&gt;

&lt;p&gt;That’s why production systems usually avoid separate Redis instances per application server.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ The Correct Approach: Centralized Redis
&lt;/h1&gt;

&lt;p&gt;Instead of separate caches, all backend instances use a &lt;strong&gt;shared Redis layer&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌─────────────────┐
Client → Load Balancer  → App Instances
                        └─────────────────┘
                              ↓
                     Shared Redis Cluster
                              ↓
                         PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All instances read/write from the same Redis&lt;/li&gt;
&lt;li&gt;Any update becomes immediately visible everywhere&lt;/li&gt;
&lt;li&gt;No synchronization problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`user:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the cache is invalidated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any instance fetching the data gets the latest value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture is simple, scalable, and production-friendly.&lt;/p&gt;




&lt;h1&gt;
  
  
  🤔 But What Happens When Redis Itself Needs Scaling?
&lt;/h1&gt;

&lt;p&gt;A single Redis server has limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited memory&lt;/li&gt;
&lt;li&gt;Limited CPU&lt;/li&gt;
&lt;li&gt;Single point of failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For very large systems, we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horizontal scaling&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;li&gt;High availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;Redis Cluster&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 Redis Cluster
&lt;/h1&gt;

&lt;p&gt;A Redis Cluster distributes data across multiple Redis nodes.&lt;/p&gt;

&lt;p&gt;It uses two important concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sharding&lt;/li&gt;
&lt;li&gt;Replication&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  1️⃣ Sharding — Scaling Redis Horizontally
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What is Sharding?
&lt;/h2&gt;

&lt;p&gt;Sharding means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Splitting data across multiple Redis nodes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of storing all data in one Redis server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redis Node 1
→ All users
→ All movies
→ All bookings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redis distributes keys across multiple nodes.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user:101    → Node 1
movie:201   → Node 2
booking:301 → Node 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important:&lt;br&gt;
Redis does NOT shard by entity type.&lt;/p&gt;

&lt;p&gt;It shards based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash calculation of keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HASH(key) % 16384 = slot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each node owns a range of hash slots.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Node 1 → Slots 0–5000
Node 2 → Slots 5001–10000
Node 3 → Slots 10001–16383
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ✅ Why Sharding is Important
&lt;/h1&gt;

&lt;p&gt;Sharding helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory scaling&lt;/li&gt;
&lt;li&gt;Traffic distribution&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Horizontal scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without sharding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Redis server becomes overloaded&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2️⃣ Replication — High Availability &amp;amp; Failover
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What is Replication?
&lt;/h2&gt;

&lt;p&gt;Replication means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Creating copies of Redis data on replica nodes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Master 1 → Replica 1
Master 2 → Replica 2
Master 3 → Replica 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Master 2 crashes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redis automatically promotes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Replica 2 → New Master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This process is called:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic failover&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ✅ Why Replication is Needed
&lt;/h1&gt;

&lt;p&gt;Sharding distributes data,&lt;br&gt;
but it does NOT protect against node failure.&lt;/p&gt;

&lt;p&gt;Without replication:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a node crashes,&lt;/li&gt;
&lt;li&gt;Data on that shard becomes unavailable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replication provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High availability&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;li&gt;Backup copies&lt;/li&gt;
&lt;li&gt;Reduced downtime&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  ⚔️ Sharding vs Replication
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Sharding&lt;/th&gt;
&lt;th&gt;Replication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;High Availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Split&lt;/td&gt;
&lt;td&gt;Copied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increases Memory Capacity&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handles Node Failure&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Improves Performance&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🏗️ Final Production Architecture
&lt;/h1&gt;

&lt;p&gt;Production systems usually combine both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Redis Cluster

Master 1 → Replica 1
Master 2 → Replica 2
Master 3 → Replica 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Masters handle sharded data&lt;/li&gt;
&lt;li&gt;Replicas provide failover protection&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🎯 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;When scaling distributed systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid local Redis per instance&lt;/li&gt;
&lt;li&gt;Use centralized Redis&lt;/li&gt;
&lt;li&gt;Scale Redis using sharding&lt;/li&gt;
&lt;li&gt;Ensure reliability using replication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture helps achieve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low latency&lt;/li&gt;
&lt;li&gt;High scalability&lt;/li&gt;
&lt;li&gt;High availability&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which is exactly what modern distributed systems require.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>systemdesign</category>
      <category>backend</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title># How to Build a Complete CI/CD Pipeline with GitHub Actions and Docker Hub</title>
      <dc:creator>Roshan singh</dc:creator>
      <pubDate>Wed, 25 Mar 2026 07:16:44 +0000</pubDate>
      <link>https://dev.to/roshan_singh_dd54d52bbaa7/-how-to-build-a-complete-cicd-pipeline-with-github-actions-and-docker-hub-1dda</link>
      <guid>https://dev.to/roshan_singh_dd54d52bbaa7/-how-to-build-a-complete-cicd-pipeline-with-github-actions-and-docker-hub-1dda</guid>
      <description>&lt;p&gt;&lt;strong&gt;## Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll show you how to set up a complete CI/CD pipeline that automatically builds Docker images, pushes them to Docker Hub, and deploys your application to a production server - all triggered by a simple git push!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## What You'll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up GitHub Actions for automated builds&lt;/li&gt;
&lt;li&gt;Building and pushing Docker images to Docker Hub&lt;/li&gt;
&lt;li&gt;Deploying containerized applications to a remote server&lt;/li&gt;
&lt;li&gt;Version tagging with Git commit SHAs&lt;/li&gt;
&lt;li&gt;Zero-downtime deployments with Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;## Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub repository with your application code&lt;/li&gt;
&lt;li&gt;A Docker Hub account&lt;/li&gt;
&lt;li&gt;A remote server (VPS/Cloud VM) with Docker and Docker Compose installed&lt;/li&gt;
&lt;li&gt;SSH access to your server&lt;/li&gt;
&lt;li&gt;Basic understanding of Docker and Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;## Architecture Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our CI/CD pipeline consists of two main jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build &amp;amp; Push&lt;/strong&gt;: Build Docker images and push them to Docker Hub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt;: Pull the new images on the server and restart containers
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git Push → GitHub Actions → Build Images → Docker Hub → Deploy to Server → Live!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;## Step 1: Project Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what your project structure should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-project/
├── .github/
│   └── workflows/
│       └── deploy.yml          # CI/CD workflow
├── backend/
│   ├── Dockerfile              # Backend Docker image
│   └── ... (your backend code)
├── frontend/
│   ├── Dockerfile              # Frontend Docker image
│   └── ... (your frontend code)
├── docker-compose.prod.yml     # Production deployment config
└── nginx.conf                  # Nginx configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;## Step 2: Create Dockerfiles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Backend Dockerfile Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# backend/Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 5000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;### Frontend Dockerfile Example&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# frontend/Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/dist /usr/share/nginx/html&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; nginx.conf /etc/nginx/conf.d/default.conf&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## Step 3: Create Docker Compose Production File&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.prod.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yourdockerhub/crm-backend:${CRM_BACKEND_TAG:-latest}&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;crm-backend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=production&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=${DATABASE_URL}&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5000:5000"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yourdockerhub/crm-frontend:${CRM_FRONTEND_TAG:-latest}&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;crm-frontend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:80"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:alpine&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-proxy&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx.conf:/etc/nginx/nginx.conf:ro&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;## Step 4: Create GitHub Actions Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-and-push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and push Docker images&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Log in to Docker Hub&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/login-action@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DOCKERHUB_USERNAME }}&lt;/span&gt;
          &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DOCKERHUB_TOKEN }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate image tags&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tag&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "full=${GITHUB_SHA}" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;
          &lt;span class="s"&gt;echo "short=${GITHUB_SHA:0:7}" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and push backend image&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/build-push-action@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
          &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend/Dockerfile&lt;/span&gt;
          &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-backend:latest&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-backend:${{ steps.tag.outputs.full }}&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-backend:${{ steps.tag.outputs.short }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and push frontend image&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/build-push-action@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend&lt;/span&gt;
          &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend/Dockerfile&lt;/span&gt;
          &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-frontend:latest&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-frontend:${{ steps.tag.outputs.full }}&lt;/span&gt;
            &lt;span class="s"&gt;yourdockerhub/crm-frontend:${{ steps.tag.outputs.short }}&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to production server&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build-and-push&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copy configuration files to server&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/scp-action@v0.1.7&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docker-compose.prod.yml,nginx.conf"&lt;/span&gt;
          &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/crm-app"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy application&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@v1.0.0&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;cd ~/crm-app&lt;/span&gt;
            &lt;span class="s"&gt;TAG="${{ github.sha }}"&lt;/span&gt;

            &lt;span class="s"&gt;# Clean up old images&lt;/span&gt;
            &lt;span class="s"&gt;sudo docker image prune -a -f&lt;/span&gt;

            &lt;span class="s"&gt;# Pull new images&lt;/span&gt;
            &lt;span class="s"&gt;sudo docker compose -f docker-compose.prod.yml pull backend frontend&lt;/span&gt;

            &lt;span class="s"&gt;# Recreate containers with new images&lt;/span&gt;
            &lt;span class="s"&gt;sudo CRM_BACKEND_TAG="$TAG" CRM_FRONTEND_TAG="$TAG" \&lt;/span&gt;
              &lt;span class="s"&gt;docker compose -f docker-compose.prod.yml up -d \&lt;/span&gt;
              &lt;span class="s"&gt;--force-recreate --no-deps backend frontend&lt;/span&gt;

            &lt;span class="s"&gt;# Restart nginx&lt;/span&gt;
            &lt;span class="s"&gt;sudo docker compose -f docker-compose.prod.yml restart nginx&lt;/span&gt;

            &lt;span class="s"&gt;# Final cleanup&lt;/span&gt;
            &lt;span class="s"&gt;sudo docker image prune -a -f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;## Step 5: Configure GitHub Secrets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to your GitHub repository → Settings → Secrets and variables → Actions&lt;/p&gt;

&lt;p&gt;Add the following secrets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;DOCKERHUB_USERNAME&lt;/strong&gt;: Your Docker Hub username&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOCKERHUB_TOKEN&lt;/strong&gt;: Docker Hub access token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH_HOST&lt;/strong&gt;: Your server IP address or domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH_USER&lt;/strong&gt;: SSH username&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH_KEY&lt;/strong&gt;: Your private SSH key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;## Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You now have a fully automated CI/CD pipeline! Every push to main will automatically build, test, and deploy your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: #docker #cicd #githubactions #devops #automation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions? Drop them in the comments below! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>automation</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
