مستوى المقال: متوسط — يفترض إنك تعرف Node.js و Express وفاهم الفرق بين HTTP request وresponse. لو لسه مبتدئ في الـ async، اقرأ مقال "Event Loop في JavaScript للمتوسط" قبل ده.
لو dashboard المراقبة بتاعك شغّال بـ setInterval(fetch, 1000) و 200 محلل مفتوحينه في وقت الذروة، السيرفر بياخد 200 طلب/ثانية على endpoint بسيط. 94% من الطلبات دي مالهاش لزمة لأن الداتا ما اتغيرتش. Server-Sent Events (SSE) بيقلب المعادلة: السيرفر بيدفع التحديثات للعميل لحظة حدوثها، بدون polling وبدون WebSocket.
المشكلة باختصار
الـ polling شائع لأنه بسيط: العميل يسأل كل ثانية، السيرفر يرد. بس الـ trade-off في التكلفة. كل طلب فيه TCP handshake (لو HTTP/1.1 بدون keep-alive)، headers بحجم 400-800 بايت، و round-trip كامل. لو الداتا بتتغير كل 10 ثواني والـ polling كل ثانية، 9 من 10 طلبات بترجع نفس الـ payload. الـ bandwidth والـ CPU بيتحرقوا بدون فايدة، والـ user بيشوف داتا قديمة لحد ثانية.
ليه SSE وليس WebSocket في كل حالة
WebSocket bi-directional ومبني على protocol مختلف عن HTTP العادي. بيدّيك قوة، بس بتكلفة:
- handshake خاص بـ
Upgrade: websocket— بعض الـ proxies والـ load balancers محتاجة إعدادات إضافية عشان تدعمه. - مكتبات client زي Socket.io بتزن 45KB minified+gzip. EventSource مدمج في كل متصفح من 2012.
- الـ reconnect logic لازم تكتبها بنفسك أو تعتمد على مكتبة كبيرة.
- الـ debugging أصعب لأن الـ frames مش HTTP عادي.
SSE بسيط جدًا فوق HTTP: response مفتوحة بـ Content-Type: text/event-stream، والسيرفر بيكتب رسائل نصية في الستريم. المتصفح فيه EventSource built-in بـ reconnect تلقائي.
مثال للتقريب: راديو vs مكالمة تليفون
تخيّل WebSocket مكالمة تليفون: الاتنين بيتكلموا والاتنين بيسمعوا. SSE راديو: المحطة بتبث، الناس بتسمع بس. لو محتاج راديو وحاولت تستخدم تليفون، انت بتدفع تكلفة line مشغول من غير ما تحتاج كلام في الاتجاه التاني.
التعريف الدقيق
طبقًا للـ HTML Living Standard من WHATWG، الـ Server-Sent Events هو spec رسمي بيعرّف:
- endpoint بـ MIME type
text/event-stream. - format نصي بسيط: كل event عبارة عن
event:وdata:و سطرين فاضيين في النهاية. - API في المتصفح اسمه
EventSourceبيدير الـ connection والـ reconnect. - دعم رسمي للـ event id والـ
Last-Event-IDheader علشان الـ resume بعد انقطاع.
متى SSE الاختيار الأذكى
- الداتا one-way: السيرفر بيبعت، العميل بيستقبل. (live metrics، notifications، log tail، AI streaming من Anthropic أو OpenAI APIs).
- محتاج reconnect تلقائي بدون كود إضافي.
- عايز تشتغل خلف أي proxy عادي بدون إعدادات WebSocket خاصة.