أحداث مرسلة من الخادم في Go: تطبيقات ويب تفاعلية بدون WebSocket

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أحداث مرسلة من الخادم في Go: عندما يكون WebSocket مبالغًا فيه



تخيل: أنت تكتب لوحة تحكم لمراقبة الخوادم. يتم تحديث البيانات كل 5 ثوانٍ. يجب أن يتلقى العميل إشعارات بانخفاض الحمل. ماذا ستختار؟ WebSocket؟ استقصاء طويل؟ ماذا لو أخبرتك أن هناك تقنية تعمل فوق HTTP العادي، ولا تتطلب مكتبات إضافية على العميل، وهي مثالية لنقل البيانات أحادي الاتجاه؟



تعرف على الأحداث المرسلة من الخادم (SSE). إنه بروتوكول مدمج في HTML5، يسمح للخادم بإرسال البيانات إلى العميل في الوقت الفعلي عبر اتصال HTTP واحد. على عكس WebSocket، يعمل SSE في اتجاه واحد فقط - من الخادم إلى العميل. ولكن هذا يجعله مثاليًا للإشعارات والسجلات وأسعار الأسهم وأي مهام حيث يكون الخادم مصدر البيانات والعميل مستمعًا سلبيًا.



في هذه المقالة، سنشرح كيفية تنفيذ الأحداث المرسلة من الخادم في Go. ستتعلم كيفية إنشاء بث بسيط، وكيفية نقل الأحداث المخصصة، وكيفية التعامل مع فصل العملاء. هيا بنا!



لماذا Go + SSE قوي؟



Go هي لغة مصممة لتطبيقات الشبكات. Goroutines والقنوات الخاصة بها تناسب نموذج SSE بشكل مثالي: كل اتصال هو Goroutine منفصل، وتضمن القنوات نقلًا آمنًا للبيانات. بالإضافة إلى ذلك، Go هي لغة مترجمة بأداء ممتاز. يمكنك الاحتفاظ بعشرات الآلاف من اتصالات SSE المفتوحة دون استهلاك كبير للذاكرة.



الميزة الرئيسية لـ SSE مقارنة بـ WebSocket هي البساطة. على العميل، يتم استخدام واجهة برمجة تطبيقات EventSource العادية، والتي تعمل في جميع المتصفحات الحديثة. لا حاجة لمكتبات إضافية، ولا حاجة لأطر عمل. الجزء الخادم هو معالج HTTP عادي مع الرؤوس الصحيحة.



متى يجب استخدام SSE؟

  • نقل أحادي الاتجاه - يرسل الخادم البيانات، والعميل يستقبل فقط.
  • الإشعارات والتنبيهات - نظام مراقبة، إشعارات دفع.
  • بث البيانات - السجلات، الأسعار، التغريدات، الأخبار.
  • إعادة الاتصال التلقائي - المتصفح يعيد الاتصال تلقائيًا عند الانقطاع.


أساسيات بروتوكول الأحداث المرسلة من الخادم



قبل كتابة الكود، دعنا نفهم كيف يعمل SSE على مستوى HTTP. عندما يفتح العميل اتصالًا، يرسل الخادم رؤوسًا خاصة:



Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive


بعد ذلك، يرسل الخادم البيانات بالتنسيق:



data: رسالة



يتم فصل كل رسالة بسطرين جديدين. يمكن إرسال عدة حقول:



event: userlogindata: {"username": "alice"}



يحدد الحقل event نوع الحدث، بينما data هو محتواه (عادةً JSON). هناك أيضًا حقول id (معرف آخر حدث) و retry (وقت إعادة الاتصال بالميلي ثانية).



كتابة خادم SSE بلغة Go



لنبدأ بأبسط شيء - خادم يرسل الوقت الحالي كل ثانية. أنشئ ملف main.go:



package main

import ( "fmt" "net/http" "time")

func main() { http.HandleFunc("/events", sseHandler) http.ListenAndServe(":8080", nil)}

func sseHandler(w http.ResponseWriter, r *http.Request) { // تعيين الرؤوس لـ SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive")

// إنشاء flusher للإرسال الفوري للبيانات flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return }

// حلقة لا نهائية لإرسال الأحداث for { select { case <-r.Con

المدونات

توصيات الكتب