بازگشت به کتابخانهکتابخانه13.2وب بلادرنگ: SSE ،WebSocket ،Long-Polling
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 13.2فصل ۱۳وب بلادرنگ و پروتکل‌های مدرن

وب بلادرنگ: SSE ،WebSocket ،Long-Polling

  • ~۱۴ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

HTTP کلاسیک تک‌طرفه است: کلاینت می‌پرسد، سرور جواب می‌دهد. برای «سرور خودش خبر دهد» چهار الگو داریم — و انتخاب بینشان سؤال ثابت مصاحبه‌های بلادرنگ است.

الگوجهتبستربهترین جا
Short Pollingکلاینت → سرور، دوره‌ایHTTP معمولیبه‌روزرسانی غیرحساس به تأخیر (هر ۳۰ ثانیه)
Long Pollingکلاینت می‌پرسد، سرور نگه می‌دارد تا داده بیایدHTTP معمولیسازگار با همه‌جا؛ ولی اتصال‌های معلق منابع می‌خورند
SSE — Server-Sent Eventsفقط سرور → کلاینتHTTP معمولی، یک اتصال بازنوتیفیکیشن، فید زنده، استریم توکن LLM؛ auto-reconnect رایگان
WebSocketدوطرفه کاملUpgrade از HTTP به پروتکل فریم‌بندیچت، بازی، همکاری زنده — جایی که کلاینت هم زیاد حرف می‌زند

قانون تصمیم: اگر فقط سرور حرف می‌زند (قیمت لحظه‌ای، استریم جواب هوش مصنوعی، نوتیف) SSE ساده‌تر، سبک‌تر و خودکار reconnect دارد؛ اگر دوطرفه و پرتراکنش است (چت، بازی) WebSocket. Long Polling فقط برای سازگاری با شبکه‌های قدیمی/سخت‌گیر. Webhook برای سرور-به-سرور است، نه مرورگر.

مقیاس‌دادن اتصال‌های ماندگار

DIAGRAMمیلیون‌ها اتصال WebSocket
Clients
LB — L4
Gateway 1..N — اتصال‌های ماندگار
Pub/Sub لایه fanout
سرویس‌های منطق
  • هر node مدرن می‌تواند صدها هزار اتصال TCP نگه دارد (با تیونینگ file descriptor و حافظه) — ولی اتصال state است: node باید بداند هر کاربر به کدام socket وصل است.
  • پیام به کاربرِ روی node دیگر: رجیستری (Redis: user→node) یا لایه Pub/Sub که همه Gateway ها عضوش‌اند و هرکدام به اتصال‌های محلی‌اش fanout می‌کند.
  • Heartbeat اجباری: هر ~۳۰ ثانیه ping/pong تا NAT و پروکسی اتصال را نکشند؛ قطع‌بی‌خداحافظی را با TTL بفهم.
  • Reconnection با backoff + جمع‌کردن عقب‌ماندگی: کلاینت با «آخرین event_id دیده‌شده» برمی‌گردد و سرور از همان نقطه ادامه می‌دهد (resume).
  • Load balancing اتصال ماندگار با L4 و consistent hashing؛ ولی یادت باشد reconnect ها به گره‌ای متفاوت می‌توانند برسند — resume state باید قابل حمل باشد.

به زبان ساده

سه راه برای «زنده» بودن صفحه: هر چند ثانیه سؤال‌کردن (long-polling)، کانال یک‌طرفه سروربه‌کلاینت (SSE) و خط دوطرفه دائمی (WebSocket) — هر کدام قیمت خودش را دارد.

مثال واقعی

قیمت لحظه‌ای بورس با SSE کافی است چون فقط سرور حرف می‌زند؛ اما چت دوطرفه به WebSocket نیاز دارد چون هر دو طرف پی در پی حرف می‌زنند.

دانش‌سنجی

آزمون درس

۴ Q
01
برای استریم زنده قیمت سهام به ۱۰۰هزار بیننده (فقط نمایش)، انتخاب؟
02
چرا چت را با SSE پیاده نمی‌کنیم؟
03
پیامی باید به کاربری برسد که socket اش روی Gateway شماره ۳ است و رویداد در Gateway شماره ۷ تولید شده. راه؟
04
کلاینت WebSocket بعد از ۱۰ دقیقه آفلاین برمی‌گردد. رفتار درست؟