ساخت اپلیکیشنهای Real-Time با WebSockets
استفاده از Polling برای اپلیکیشن شما بد است.
من زمانی یک ویجت چت را با استفاده از AJAX polling ساختم. اپلیکیشن را طوری تنظیم کردم که هر ثانیه از سرور درخواست پیامهای جدید کند. کار میکرد، اما کند بود. رابط کاربری (UI) لگ داشت. سرور بیش از حد فشار میخورد. اکثر درخواستها دادههای خالی برمیگرداندند. مثل این بود که بخواهید یک وان حمام را با یک قاشق چایخوری پر کنید.
WebSockets این وضعیت را تغییر میدهند.
به جای درخواستهای مداوم، شما یک اتصال پایدار (persistent connection) باز میکنید. این کار اجازه جریان دوطرفه دادهها را میدهد. سرور میتواند دادهها را فوراً به کلاینت ارسال (push) کند. کلاینت میتواند دادهها را فوراً به سرور بفرستد.
چرا از WebSockets استفاده کنیم؟
• تأخیر (Latency) از صدها میلیثانیه به دهها میلیثانیه کاهش مییابد. • بار سرور (Server load) قابل پیشبینی میشود. • با حذف هدرهای تکراری HTTP، در پهنای باند صرفهجویی میکنید. • برای چت، اعلانهای زنده (live notifications) و بازیهای چندنفره مناسب است.
نحوه عملکرد:
اتصال با یک درخواست HTTP upgrade شروع میشود. اگر سرور موافقت کند، کد وضعیت 101 را ارسال میکند. پس از آن، از یک پروتکل باینری خام یا متنی استفاده میکنید. دیگر کوکیها یا هدرهایی وجود ندارند که سرعت شما را کم کنند.
تلههای رایجی که باید از آنها دوری کرد:
- قطع شدن اتصال: شبکهها دچار اختلال میشوند. شما باید یک استراتژی تلاش مجدد (retry strategy) مانند exponential backoff پیادهسازی کنید.
- نشت حافظه (Memory leaks): همیشه وقتی کاربری خارج میشود، سوکتهای خود را ببندید. اتصالات زامبی (Zombie connections) حافظه سرور را میبلعند.
- حلقههای پیام: هنگام پخش همگانی (broadcasting)، فرستنده اصلی را نادیده بگیرید. در غیر این صورت، کاربر پیام خودش را دو بار میبیند.
- اتصالات بیکار (Idle connections): برخی پروکسیها اتصالات ساکت را میبندند. از یک ضربان قلب (heartbeat) به صورت ping/pong استفاده کنید تا سوکت زنده بماند.
از پرسیدن از سرور درباره تغییرات دست بردارید. شروع کنید به باز نگه داشتن یک خط ارتباطی تا هر زمان که نیاز داشتید بتوانید صحبت کنید.
چالش شما:
یک مثال چت ساده را در نظر بگیرید. یک نشانگر "در حال تایپ..." (typing...) اضافه کنید. آن را روی هاستی مثل Render یا Fly.io مستقر (deploy) کنید. وقتی دیدید آن نشانگر بدون Polling به صورت Real-time حرکت میکند، یعنی سطح خود را ارتقا دادهاید.