WebSockets & Realtime Systems Programming · درس

استراتيجيات التوسّع الأفقي

تعرّفوا إلى كيفية توزيع اتصالات WebSocket على عدة مثيلات للخادم لتحسين الأداء.

الدرس 1 من 411 خطوة

استراتيجيات التوسّع الأفقي درس مجاني في WebSockets & Realtime Systems Programming على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في WebSockets & Realtime Systems Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة WebSockets & Realtime Systems Programming 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

Why Scale WebSockets?

Imagine your awesome app suddenly gets super popular! Thousands, even millions, of users want to connect simultaneously.

A single server can only handle so many active WebSocket connections before it gets overwhelmed. It's like a single lane highway trying to handle rush hour traffic!

To keep your app fast and reliable, we need strategies to handle this high traffic.

Grow Up or Grow Out?

When a single server isn't enough, you have two main options to scale:

  • Vertical Scaling: Upgrade your existing server with more CPU, RAM, or faster storage. Think of it as making your single highway lane wider.
  • Horizontal Scaling: Add more servers to share the load. This is like adding more lanes to your highway, or even building parallel highways!

For WebSockets, horizontal scaling is often preferred. It offers better resilience and flexibility.

The Stateful Challenge

WebSockets are different from traditional HTTP requests. While HTTP is often stateless (each request is independent), WebSockets create a stateful, persistent connection.

This means a client and server maintain an open line of communication. If you just randomly send a client to a different server mid-conversation, it won't know what's going on!

This 'state' makes horizontal scaling a bit trickier than with stateless APIs.

Meet the Load Balancer

To distribute traffic across multiple servers, we use a load balancer. Think of it as a smart traffic cop standing at the entrance of your server farm.

Its job is to efficiently direct incoming client connections to one of your available backend WebSocket servers. This prevents any single server from becoming a bottleneck.

WebSocket Handshake & LB

Remember, a WebSocket connection starts as an HTTP request and then 'upgrades' to a WebSocket. Your load balancer needs to understand this process.

It must be configured to correctly handle the Upgrade header in the HTTP request and then maintain the TCP connection for the WebSocket traffic. Without this, the connection won't establish!

Keeping It 'Sticky': Sticky Sessions

Because WebSockets are stateful, it's often important that a client continues talking to the same backend server it initially connected to.

This is achieved using a technique called sticky sessions (or session affinity). The load balancer remembers which server a client used and directs all subsequent requests from that client to the same server.

Common methods include using the client's IP address or a special cookie.

Sticky Session Example

Let's see a simple Node.js WebSocket server. Imagine you have multiple instances of this server running. With sticky sessions, your client would consistently connect to the same server, getting the same 'Server ID'.

To run this: npm install ws then node server.js

const WebSocket = require('ws');
const http = require('http');

const serverId = `Server-${Math.floor(Math.random() * 100) + 1}`; 

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end(`Hello from HTTP on ${serverId}\n`);
});

const wss = new WebSocket.Server({ server });

wss.on('connection', ws => {
  console.log(`Client connected to ${serverId}`);
  ws.send(`Welcome from ${serverId}!`);

  ws.on('message', message => {
    console.log(`Received on ${serverId}: ${message}`);
    ws.send(`Echo from ${serverId}: ${message}`);
  });

  ws.on('close', () => {
    console.log(`Client disconnected from ${serverId}`);
  });
});

server.listen(8080, () => {
  console.log(`${serverId} listening on port 8080`);
});

Sticky Sessions' Limits

While sticky sessions are great for maintaining a client's connection to a single server, they have drawbacks:

  • Server Failure: If the sticky server crashes, the client loses its connection and might need to re-establish state on a new server.
  • Cross-Server Communication: If a client on Server A needs to send a message to a client on Server B, sticky sessions alone won't solve this.

For more complex scenarios, you'll need more advanced strategies, which we'll cover later!

Load Balancer Methods

Load balancers use different algorithms to decide where to send new connections:

  • Round Robin: Sends connections to servers in a rotating order (Server A, then B, then C, then A...).
  • Least Connections: Sends connections to the server with the fewest active connections.
  • IP Hash: Uses the client's IP address to consistently direct it to the same server (ideal for sticky sessions).

The choice depends on your application's needs.

Quick Check: Scaling WebSockets

You've learned about horizontal scaling and the role of load balancers and sticky sessions. Let's test your understanding!

Recap: Scaling Up!

Great job! In this lesson, you learned why horizontal scaling is vital for high-traffic WebSocket applications.

  • Horizontal scaling adds more servers to handle increased load.
  • Load balancers distribute incoming connections across these servers.
  • They must support the WebSocket upgrade process.
  • Sticky sessions ensure a client consistently connects to the same backend server, maintaining its state.

Next, we'll explore how to configure these load balancers effectively!

البدء مجانًا

تعلم WebSockets & Realtime Systems Programming مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
12
الدروس
47

الأسئلة الشائعة

هل درس «استراتيجيات التوسّع الأفقي» مجاني؟

نعم — نص درس «استراتيجيات التوسّع الأفقي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة WebSockets & Realtime Systems Programming، انتقل إلى CoddyKit PRO. تتضمن دورة WebSockets & Realtime Systems Programming 4 دروس في المجموع.

ماذا ستتعلم في «استراتيجيات التوسّع الأفقي»؟

تعرّفوا إلى كيفية توزيع اتصالات WebSocket على عدة مثيلات للخادم لتحسين الأداء. تتمرن على WebSockets & Realtime Systems Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ WebSockets & Realtime Systems Programming؟

لا تُشترط خبرة سابقة. WebSockets & Realtime Systems Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «استراتيجيات التوسّع الأفقي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس WebSockets & Realtime Systems Programming هذا؟

نعم. كل درس في WebSockets & Realtime Systems Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. استراتيجيات التوسّع الأفقي
  2. موازنة تحميل WebSockets
  3. إدارة الحالة الموزّعة
  4. وسيط Pub/Sub باستخدام Redis
← العودة إلى WebSockets & Realtime Systems Programming