نحوه پیاده سازی رویدادهای ارسال شده توسط سرور در Go
رویدادهای ارسال شده از سرور (SSE) یک فناوری قدرتمند است که امکان ارتباط بیدرنگ و یک طرفه از سرورها به مشتریان را فراهم میکند.
در این مقاله، نحوه پیادهسازی SSE در Go را تحلیل میکنیم، در مورد مزایای آن، موارد استفاده و ارائه مثالهای عملی صحبت میکنیم. در پایان، شما باید اصول ساخت برنامه های بلادرنگ با ارتباطات کارآمد و یک طرفه را بدانید.
رویدادهای ارسال شده توسط سرور چیست؟
SSE یک فناوری وب است که به سرورها اجازه می دهد تا داده ها را از طریق یک اتصال HTTP به مشتریان ارسال کنند.
بر خلاف WebSockets، SSE یک جهته است، و اجرای آن را سادهتر میکند و برای سناریوهایی ایدهآل میکند که در آن بهروزرسانیهای بلادرنگ از سرور مورد نیاز است، اما ارتباط مشتری به سرور ضروری نیست.
توسعه یک برنامه وب که از SSE استفاده می کند ساده است. برای پخش جریانی رویدادها به قسمت جلویی، به کمی کد روی سرور نیاز دارید، اما کد سمت کلاینت در مدیریت رویدادهای ورودی تقریباً شبیه به وبسوکتها عمل میکند. این یک اتصال یک طرفه است، پس نمی توانید رویدادها را از مشتری به سرور ارسال کنید.
مزایای SSE
سادگی : پیاده سازی SSE در مقایسه با WebSockets آسان تر است.
پشتیبانی از مرورگر بومی : اکثر مرورگرهای مدرن از SSE خارج از جعبه پشتیبانی می کنند.
اتصال مجدد خودکار : در صورت قطع اتصال، کلاینت ها به طور خودکار سعی می کنند دوباره وصل شوند.
کارآمد : از یک اتصال HTTP استفاده می کند و هزینه های اضافی را کاهش می دهد.
نحوه پیاده سازی SSE در Go
به عنوان مثال در اینجا، ما یک سرور SSE ساده در Go ایجاد می کنیم که فقط داده ها را در هر ثانیه با مهر زمانی فعلی به مشتری ارسال می کند. سپس مشتری می تواند به سرور ما در پورت 8080 متصل شود و این پیام ها را دریافت کند.
یک مثال واقعی می تواند چیزی پیچیده تر مانند ارسال اعلان ها، نمایش به روز رسانی نوار پیشرفت و غیره باشد.
package main import ( "fmt" "net/http" "time" ) func sseHandler (w http.ResponseWriter, r *http.Request) { // Set http headers required for SSE w.Header().Set( "Content-Type" , "text/event-stream" ) w.Header().Set( "Cache-Control" , "no-cache" ) w.Header().Set( "Connection" , "keep-alive" ) // You may need this locally for CORS requests w.Header().Set( "Access-Control-Allow-Origin" , "*" ) // Create a channel for client disconnection clientGone := r.Context().Done() rc := http.NewResponseController(w) t := time.NewTicker(time.Second) defer t.Stop() for { select { case <-clientGone: fmt.Println( "Client disconnected" ) return case <-tC: // Send an event to the client // Here we send only the "data" field, but there are few others _, err := fmt.Fprintf(w, "data: The time is %s\n\n" , time.Now().Format(time.UnixDate)) if err != nil { return } err = rc.Flush() if err != nil { return } } } } func main () { http.HandleFunc( "/events" , sseHandler) fmt.Println( "server is running on :8080" ) if err := http.ListenAndServe( ":8080" , nil ); err != nil { fmt.Println(err.Error()) } }
اجزای کلیدی اجرای SSE
جریان رویداد یک جریان ساده از داده های متنی است که باید با استفاده از UTF-8 کدگذاری شود. پیامها در جریان رویداد با یک جفت نویسه خط جدید از هم جدا میشوند - \n\n . دو نقطه به عنوان اولین کاراکتر یک خط در اصل یک نظر است و نادیده گرفته می شود.
در سرور ما در اینجا انجام می شود:
rc := http.NewResponseController(w) fmt.Fprintf(w, "data: The time is %s\n\n" , time.Now().Format(time.UnixDate)) // To make sure that the data is sent immediately rc.Flush()
سروری که رویدادها را ارسال میکند باید با استفاده از نوع MIME متن/جریان رویداد پاسخ دهد. ما این کار را با تنظیم هدر پاسخ در اینجا انجام می دهیم:
w.Header().Set( "Content-Type" , "text/event-stream" )
ممکن است متوجه شده باشید که ما تعداد کمی هدر دیگر را نیز تنظیم کرده ایم. یکی باز نگه داشتن اتصال HTTP و دیگری دور زدن CORS:
w.Header().Set( "Cache-Control" , "no-cache" ) w.Header().Set( "Connection" , "keep-alive" ) w.Header().Set( "Access-Control-Allow-Origin" , "*" )
و آخرین قطعه مهم تشخیص قطع ارتباط است. در Go، آن را به عنوان یک پیام در یک کانال مشخص دریافت خواهیم کرد:
clientGone := r.Context().Done() for { select { case <-clientGone: fmt.Println( "Client disconnected" ) return } }
هر پیام دریافتی دارای ترکیبی از فیلدهای زیر است، یکی در هر خط. در سرور ما فقط فیلد داده را ارسال می کنیم که کافی است، زیرا سایر فیلدها اختیاری هستند. جزئیات بیشتر در اینجا .
رویداد - رشته ای که نوع رویداد توصیف شده را مشخص می کند.
داده - فیلد داده برای پیام.
id – شناسه رویداد برای تنظیم آخرین مقدار شناسه رویداد شی EventSource.
سعی مجدد - زمان اتصال مجدد
نحوه دریافت رویدادها در سمت مشتری
در سمت جلو یا سمت کلاینت، باید از رابط EventSource استفاده کنید. این یک API مرورگر است که رویدادهای ارسال شده از سرور را در بر می گیرد. در مثال زیر، برنامه مرورگر ما رویدادها را از سرور دریافت می کند و آنها را در یک فهرست چاپ می کند.
<!doctype html > < html > < body > < ul id = "list" > </ ul > </ body > < script type = "text/javascript" > const eventSrc = new EventSource( "http://127.0.0.1:8080/events" ); const list = document .getElementById( "list" ); eventSrc.onmessage = ( event ) => { const li = document .createElement( "li" ); li.textContent = `message: ${event.data} ` ; list.appendChild(li); }; </ script > </ html >
در اینجا ممکن است در مرورگر شما به نظر برسد:
دیگر اخبار
استارتآپها باید برای توسعه نرمافزار به کمک هوش مصنوعی در سال 2024 استراتژی و بودجه داشته باشند
بهترین روش ها برای SSE در Golang
قالب بندی رویداد
در یک پروژه دنیای واقعی، یک رشته داده ساده ممکن است کافی نباشد. در این موارد، استفاده از یک فرمت ساختاریافته مانند JSON می تواند گزینه خوبی برای ارسال چندین فیلد داده یک بار باشد. در اینجا یک مثال است:
{ "status" : "in_progress" , "completion" : 51.22 }
استراتژی اتصال مجدد و مدیریت خطا
همیشه ممکن است هر دو طرف مشکلی پیش بیاید: سرور ممکن است به دلایلی اتصال را رد کند یا کلاینت به طور ناگهانی قطع شود.
در هر مورد، باید یک استراتژی عقب نشینی برای اتصال مجدد دلپذیر پیاده سازی کنید. بهتر است یک پیام را از دست بدهید تا اینکه حلقه رویداد را به طور کامل بشکنید.
در جاوا اسکریپت، می توانید خطاهای موجود در EventSource را تحلیل کنید و سپس مطابق با آن عمل کنید:
eventSrc.onerror = ( err ) => { console .error( "EventSource failed:" , err); };
تعادل بار
برای برنامه های پرترافیک، می توانید از Load Balancer استفاده کنید، برای مثال NGINX. اگر قصد دارید مشتریان زیادی به سرور خود متصل شوند، خوب است که از قبل آن را با شبیه سازی بارگیری از مشتریان آزمایش کنید.
موارد استفاده برای SSE
داشبوردهای بلادرنگ
نمرات ورزشی زنده
فیدهای رسانه های اجتماعی
تیک تیک های بازار سهام
شاخص های پیشرفت برای وظایف طولانی مدت
نتیجه گیری
رویدادهای ارسال شده از سرور یک راه کارآمد و ساده برای پیاده سازی ارتباط سرور به مشتری در زمان واقعی در برنامه های Golang ارائه می دهند. با استفاده از SSE، توسعه دهندگان می توانند برنامه های وب پاسخگو و پویا با حداقل هزینه و پیچیدگی ایجاد کنند.
همانطور که برنامه های کاربردی مبتنی بر SSE خود را می سازید، به یاد داشته باشید که مقیاس پذیری، مدیریت خطا و پیاده سازی سمت مشتری را در نظر بگیرید تا از یک سیستم ارتباطی قوی و کارآمد در زمان واقعی اطمینان حاصل کنید.
مقالات بیشتری را از packagemain.tech کاوش کنید
ارسال نظر