Scaling Distributed Systems: Vertical Scaling, Horizontal Scaling & Auto Scaling

Publié le - Dernière modification le

<p>Scaling is one of the most important concepts in system design. As traffic increases, applications must handle more requests efficiently without crashing or slowing down.</p> <p>This article covers vertical scaling, Node.js clustering, autoscaling strategies, capacity estimation, and queue-based architectures for large-scale applications.</p> <h2>Vertical Scaling</h2> <h3>What is Vertical Scaling?</h3> <p>Vertical scaling means increasing the resources of a single machine to handle higher traffic.</p> <p>This includes:</p> <ul> <li>Increasing CPU power</li> <li>Adding more RAM</li> <li>Upgrading storage</li> <li>Better machine configurations</li> </ul> <p>Example:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">2</span> <span class="sh__token--class">CPU</span> <span class="sh__token--sign">+</span> <span class="sh__token--class">4GB</span> <span class="sh__token--class">RAM</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">8</span> <span class="sh__token--class">CPU</span> <span class="sh__token--sign">+</span> <span class="sh__token--class">32GB</span> <span class="sh__token--class">RAM</span></span> </code></pre> <p>Vertical scaling is simple to implement but has hardware limitations.</p> <hr /> <h2>Limitation in Node.js</h2> <p>Node.js runs on a&nbsp;<strong>single-threaded event loop</strong>.</p> <p>This means:</p> <ul> <li>One process typically uses only one CPU core</li> <li>Multi-core CPUs are not fully utilized automatically</li> </ul> <p>In contrast, languages such as:</p> <ul> <li>Go</li> <li>Rust</li> <li>Java</li> </ul> <p>support multithreading and can efficiently utilize multiple CPU cores.</p> <hr /> <h2>A Naive Approach (Incorrect)</h2> <p>A beginner approach might be manually starting multiple Node.js processes:</p> <pre><code class="language-bash"><span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> <span class="sh__line"><span class="sh__token--identifier">node</span> <span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span> </code></pre> <h3>Problems with This Approach</h3> <ol> <li>Difficult process management</li> <li>Port conflicts between processes</li> <li>No built-in load balancing</li> <li>No fault tolerance or auto recovery</li> </ol> <hr /> <h2>Solution: Node.js Cluster Module</h2> <p>Node.js provides a built-in&nbsp;<code><span class="sh__line"><span class="sh__token--identifier">cluster</span></span></code>&nbsp;module to use multiple CPU cores.</p> <p>Benefits:</p> <ul> <li>Creates worker processes</li> <li>Uses multiple CPU cores</li> <li>Workers share the same port</li> <li>Requests are distributed automatically</li> </ul> <h3>Application Logic (<code><span class="sh__line"><span class="sh__token--identifier">index</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span></code>)</h3> <pre><code class="language-javascript"><span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--identifier">express</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">express</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">export</span> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">app</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">express</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">Worker </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">pid</span><span class="sh__token--sign">}</span><span class="sh__token--string"> started</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--identifier">app</span><span class="sh__token--sign">.</span><span class="sh__token--property">get</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">/</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">req</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">res</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">res</span><span class="sh__token--sign">.</span><span class="sh__token--property">send</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Hello World!</span><span class="sh__token--string">'</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--identifier">app</span><span class="sh__token--sign">.</span><span class="sh__token--property">get</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">/api/:n</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">req</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">res</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--keyword">let</span> <span class="sh__token--identifier">n</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">parseInt</span><span class="sh__token--sign">(</span><span class="sh__token--identifier">req</span><span class="sh__token--sign">.</span><span class="sh__token--property">params</span><span class="sh__token--sign">.</span><span class="sh__token--property">n</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--keyword">let</span> <span class="sh__token--identifier">count</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span></span> <span class="sh__line"> <span class="sh__token--keyword">if</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">n</span> <span class="sh__token--sign">&gt;</span> <span class="sh__token--class">5000000000</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">n</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">5000000000</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">&lt;</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">n</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">count</span> <span class="sh__token--sign">+</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">i</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--identifier">res</span><span class="sh__token--sign">.</span><span class="sh__token--property">send</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">Final count is </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">count</span><span class="sh__token--sign">}</span><span class="sh__token--string"> (handled by PID </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">pid</span><span class="sh__token--sign">}</span><span class="sh__token--string">)</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> </code></pre> <h3>Cluster Entry (<code><span class="sh__line"><span class="sh__token--identifier">bin</span><span class="sh__token--sign">.</span><span class="sh__token--property">js</span></span></code>)</h3> <pre><code class="language-javascript"><span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--identifier">cluster</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">cluster</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--identifier">os</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">os</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--sign">{</span> <span class="sh__token--identifier">app</span> <span class="sh__token--sign">}</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">./index.js</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">totalCPUs</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">os</span><span class="sh__token--sign">.</span><span class="sh__token--property">cpus</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span><span class="sh__token--sign">.</span><span class="sh__token--identifier">length</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">port</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">3000</span></span> <span class="sh__line"><span class="sh__token--keyword">if</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">isPrimary</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">Number of CPUs: </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">totalCPUs</span><span class="sh__token--sign">}</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">Primary process </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">pid</span><span class="sh__token--sign">}</span><span class="sh__token--string"> is running</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">&lt;</span> <span class="sh__token--identifier">totalCPUs</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">fork</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">on</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">exit</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">worker</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">Worker </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">worker</span><span class="sh__token--sign">.</span><span class="sh__token--property">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">pid</span><span class="sh__token--sign">}</span><span class="sh__token--string"> died</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Restarting worker...</span><span class="sh__token--string">'</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">fork</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--sign">}</span> <span class="sh__token--keyword">else</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">app</span><span class="sh__token--sign">.</span><span class="sh__token--property">listen</span><span class="sh__token--sign">(</span><span class="sh__token--identifier">port</span><span class="sh__token--sign">,</span> <span class="sh__token--sign">(</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">`</span><span class="sh__token--string">App listening on port </span><span class="sh__token--sign">${</span><span class="sh__token--identifier">port</span><span class="sh__token--sign">}</span><span class="sh__token--string">`</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--sign">}</span></span> </code></pre> <hr /> <h2>Parallel Computation Using Clusters</h2> <p>Heavy CPU tasks can be divided among workers.</p> <p>Instead of one process calculating everything sequentially, the workload is split across multiple CPU cores.</p> <h3>Cluster-Based Parallel Computation</h3> <pre><code class="language-javascript"><span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--identifier">cluster</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">cluster</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">import</span> <span class="sh__token--identifier">os</span> <span class="sh__token--keyword">from</span> <span class="sh__token--string">'</span><span class="sh__token--string">os</span><span class="sh__token--string">'</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">numCPUs</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">os</span><span class="sh__token--sign">.</span><span class="sh__token--property">cpus</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span><span class="sh__token--sign">.</span><span class="sh__token--identifier">length</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">n</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">1_000_000_000</span></span> <span class="sh__line"><span class="sh__token--keyword">if</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">isPrimary</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">chunkSize</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">Math</span><span class="sh__token--sign">.</span><span class="sh__token--property">floor</span><span class="sh__token--sign">(</span><span class="sh__token--identifier">n</span> <span class="sh__token--sign">/</span> <span class="sh__token--identifier">numCPUs</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--keyword">let</span> <span class="sh__token--identifier">completed</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span></span> <span class="sh__line"> <span class="sh__token--keyword">let</span> <span class="sh__token--identifier">totalSum</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">startTime</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">Date</span><span class="sh__token--sign">.</span><span class="sh__token--property">now</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">&lt;</span> <span class="sh__token--identifier">numCPUs</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">start</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">*</span> <span class="sh__token--identifier">chunkSize</span> <span class="sh__token--sign">+</span> <span class="sh__token--class">1</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">end</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">=</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">numCPUs</span> <span class="sh__token--sign">-</span> <span class="sh__token--class">1</span> <span class="sh__token--sign">?</span> <span class="sh__token--identifier">n</span> <span class="sh__token--sign">:</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">i</span> <span class="sh__token--sign">+</span> <span class="sh__token--class">1</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">*</span> <span class="sh__token--identifier">chunkSize</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">worker</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">fork</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">worker</span><span class="sh__token--sign">.</span><span class="sh__token--property">send</span><span class="sh__token--sign">(</span><span class="sh__token--sign">{</span> <span class="sh__token--identifier">start</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">end</span> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">worker</span><span class="sh__token--sign">.</span><span class="sh__token--property">on</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">message</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">partialSum</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">totalSum</span> <span class="sh__token--sign">+</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">partialSum</span></span> <span class="sh__line"> <span class="sh__token--identifier">completed</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span></span> <span class="sh__line"> <span class="sh__token--keyword">if</span> <span class="sh__token--sign">(</span><span class="sh__token--identifier">completed</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">=</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">numCPUs</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--keyword">const</span> <span class="sh__token--identifier">endTime</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">Date</span><span class="sh__token--sign">.</span><span class="sh__token--property">now</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Total Sum:</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">totalSum</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Execution Time:</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">endTime</span> <span class="sh__token--sign">-</span> <span class="sh__token--identifier">startTime</span><span class="sh__token--sign">,</span> <span class="sh__token--string">'</span><span class="sh__token--string">ms</span><span class="sh__token--string">'</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">id</span> <span class="sh__token--keyword">in</span> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">workers</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">cluster</span><span class="sh__token--sign">.</span><span class="sh__token--property">workers</span><span class="sh__token--sign">[</span><span class="sh__token--identifier">id</span><span class="sh__token--sign">]</span><span class="sh__token--sign">?</span><span class="sh__token--sign">.</span><span class="sh__token--identifier">kill</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"><span class="sh__token--sign">}</span> <span class="sh__token--keyword">else</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">on</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">message</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--sign">(</span><span class="sh__token--sign">{</span> <span class="sh__token--identifier">start</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">end</span> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">=</span><span class="sh__token--sign">&gt;</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--keyword">let</span> <span class="sh__token--identifier">sum</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span></span> <span class="sh__line"> <span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span> <span class="sh__token--identifier">start</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">&lt;</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">end</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">sum</span> <span class="sh__token--sign">+</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">i</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span></span> <span class="sh__line"> <span class="sh__token--identifier">process</span><span class="sh__token--sign">.</span><span class="sh__token--property">send</span><span class="sh__token--sign">?</span><span class="sh__token--sign">.</span><span class="sh__token--sign">(</span><span class="sh__token--identifier">sum</span><span class="sh__token--sign">)</span></span> <span class="sh__line"> <span class="sh__token--sign">}</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--sign">}</span></span> </code></pre> <h3>Sequential Computation</h3> <pre><code class="language-javascript"><span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">n</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">1_000_000_000</span></span> <span class="sh__line"><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">sum</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">0</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">start</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">Date</span><span class="sh__token--sign">.</span><span class="sh__token--property">now</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--keyword">for</span> <span class="sh__token--sign">(</span><span class="sh__token--keyword">let</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">1</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span> <span class="sh__token--sign">&lt;</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">n</span><span class="sh__token--sign">;</span> <span class="sh__token--identifier">i</span><span class="sh__token--sign">+</span><span class="sh__token--sign">+</span><span class="sh__token--sign">)</span> <span class="sh__token--sign">{</span></span> <span class="sh__line"> <span class="sh__token--identifier">sum</span> <span class="sh__token--sign">+</span><span class="sh__token--sign">=</span> <span class="sh__token--identifier">i</span></span> <span class="sh__line"><span class="sh__token--sign">}</span></span> <span class="sh__line"><span class="sh__token--keyword">const</span> <span class="sh__token--identifier">end</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">Date</span><span class="sh__token--sign">.</span><span class="sh__token--property">now</span><span class="sh__token--sign">(</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Sum:</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">sum</span><span class="sh__token--sign">)</span></span> <span class="sh__line"><span class="sh__token--identifier">console</span><span class="sh__token--sign">.</span><span class="sh__token--property">log</span><span class="sh__token--sign">(</span><span class="sh__token--string">'</span><span class="sh__token--string">Time:</span><span class="sh__token--string">'</span><span class="sh__token--sign">,</span> <span class="sh__token--identifier">end</span> <span class="sh__token--sign">-</span> <span class="sh__token--identifier">start</span><span class="sh__token--sign">,</span> <span class="sh__token--string">'</span><span class="sh__token--string">ms</span><span class="sh__token--string">'</span><span class="sh__token--sign">)</span></span> </code></pre> <hr /> <h2>Capacity Estimation</h2> <p>Before scaling, estimate how much traffic your system must handle.</p> <h3>Step 1: Estimate Requests Per Second (RPS)</h3> <p>Example:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">10</span><span class="sh__token--sign">,</span><span class="sh__token--class">000</span> <span class="sh__token--identifier">users</span> <span class="sh__token--class">&asymp;</span> <span class="sh__token--class">100</span> <span class="sh__token--class">RPS</span></span> </code></pre> <hr /> <h3>Step 2: Measure Server Capacity</h3> <p>Benchmark a single machine.</p> <p>Example:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">1</span> <span class="sh__token--identifier">server</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">500</span> <span class="sh__token--class">RPS</span></span> </code></pre> <hr /> <h3>Step 3: Estimate Required Machines</h3> <p>Formula:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">Total</span> <span class="sh__token--class">RPS</span> <span class="sh__token--sign">/</span> <span class="sh__token--class">RPS</span> <span class="sh__token--identifier">per</span> <span class="sh__token--identifier">machine</span></span> </code></pre> <p>Example:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">1000</span> <span class="sh__token--class">RPS</span> <span class="sh__token--sign">/</span> <span class="sh__token--class">500</span> <span class="sh__token--sign">=</span> <span class="sh__token--class">2</span> <span class="sh__token--identifier">machines</span></span> </code></pre> <hr /> <h2>Autoscaling Groups (ASGs)</h2> <p>Autoscaling automatically adjusts infrastructure based on demand.</p> <p>Scaling decisions can be based on:</p> <ul> <li>CPU usage</li> <li>Memory usage</li> <li>Traffic spikes</li> <li>Queue length</li> </ul> <p>Benefits:</p> <ul> <li>Saves cost</li> <li>Handles sudden traffic</li> <li>Improves availability</li> </ul> <hr /> <h2>Scaling Complex Applications</h2> <p>For high-scale systems, simple server scaling is often not enough.</p> <p>A queue-based architecture is commonly used.</p> <h3>Architecture Flow</h3> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">Client</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">Queue</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">Workers</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">Database</span><span class="sh__token--sign">/</span><span class="sh__token--class">Storage</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">Response</span></span> </code></pre> <hr /> <h2>Queue-Based Processing</h2> <p>Typical flow:</p> <ol> <li>Request arrives</li> <li>Request enters a queue</li> <li>Workers consume tasks</li> <li>Processing happens asynchronously</li> <li>Results are stored</li> </ol> <hr /> <h2>Dynamic Worker Scaling</h2> <p>As load increases:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">More</span> <span class="sh__token--class">Queue</span> <span class="sh__token--class">Jobs</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">More</span> <span class="sh__token--class">Workers</span></span> </code></pre> <p>As load decreases:</p> <pre><code class="language-text"><span class="sh__line"><span class="sh__token--class">Fewer</span> <span class="sh__token--class">Jobs</span> <span class="sh__token--class">&rarr;</span> <span class="sh__token--class">Fewer</span> <span class="sh__token--class">Workers</span></span> </code></pre> <p>This approach enables efficient horizontal scaling.</p> <hr /> <h2>Benefits of Queue-Based Systems</h2> <ul> <li>Handles high traffic efficiently</li> <li>Prevents server overload</li> <li>Enables horizontal scaling</li> <li>Improves reliability</li> <li>Supports asynchronous workloads</li> </ul> <hr /> <h2>Conclusion</h2> <p>Simple applications often scale using better machines and additional servers. However, large-scale systems rely on clustering, autoscaling, queues, and worker architectures to handle millions of requests efficiently.</p> <p>Understanding when to use vertical scaling, horizontal scaling, or distributed processing is essential for designing reliable systems.</p>

Publié 1 septembre, 2026

pankajyadav025

Full Stack Developer | React, Node.js, TypeScript

Need a feature deployed quickly, a clean responsive UI, or an urgent bug fixed? I can help. I am a Full Stack Software Developer with 1.5+ years of professional experience building fast, secure, scalable, and production ready web applications. Whether you need a new web or SaaS application, a Figma to React conversion, a responsive frontend, REST API development, or urgent Node.js backend troubl...

Article suivant

Why Good Design Matters More Than Ever for Small Businesses