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">→</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 <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 <code><span class="sh__line"><span class="sh__token--identifier">cluster</span></span></code> 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">></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">></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">></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"><</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"><</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">></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">></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"><</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">></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">></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"><</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"><</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">≈</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">→</span> <span class="sh__token--class">Queue</span> <span class="sh__token--class">→</span> <span class="sh__token--class">Workers</span> <span class="sh__token--class">→</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">→</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">→</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">→</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>