SignalR یک کتابخانه ی اوپن سورس (open-source) تحت برنامه Asp.Net است که افزودن قابلیت real-time web را به برنامه ها ساده می کند. قابلیت real-time web، قابلیتی است که کد client-side (سمت مشتری) را قادر می سازد که محتوا را خیلی سریع به سمت مشتری هدایت کند.
کاندیدا های خوب SignalR:
- برنامه هایی که به بروز رسانی با فرکانس بالا از سمت سرور نیاز دارند. به عنوان مثال می توان به بازی، شبکه های اجتماعی، رای دادن، مزایده، نقشه و برنامه های GPS اشاره کرد.
- Dashboards و برنامه های نظارتی که به عنوان مثال می توان به روزرسانی های فوری فروش یا هشدار های سفر را نام برد.
- برنامه های مشترک؛ که برنامه ی whiteboard و نرم افزار team meeting نمونه هایی از برنامه های مشترک هستند.
- برنامه هایی که به اعلان (notifications) نیاز دارند. مانند شبکه های اجتماعی، ایمیل، چت، بازی،هشدار های سفر و بسیاری از برنامه های دیگر که به اطلاع رسانی یا notification نیاز دارند.
SignalR یک API برای ایجاد تماس های از راه دور server-to-client (از سرور به مشتری) را فراهم می کند (RPC). این RPC ها از طریق کد server-side (سمت سرور) Net Core. ، توابع جاوا اسکریپت را روی مشتری (client) فراخوانی می کنند.
در زیر برخی از ویژگی های SignalR برای ASP.Net Core آمده است :
- مدیریت اتصال را به صورت خودکار کنترل می کند.
- به تمام مشتری (client) هایی که متصل یا آنلاین هستند پیام ارسال می کند؛ مانند اتاق گفتگو (chat rooms)
- برای مشتری یا گروه خاصی از مشتری ها پیام ارسال می کند.
- مقیاس هایی برای کنترل افزایش میزان ترافیک.
تاریخچه SignalR
SignalR در سال 2011 توسط دیوید فاولر و دامیان ادواردز ایجاد شد که اکنون نقش کلیدی را در جهت گیری و توسعه و هدایت ASP.NET بازی می کند و در سال 2013 به پروژه ی Asp.Net وارد و به عنوان بخشی از آن ارائه شد. در آن زمان، پروتکل WebSocket به تازگی استاندارد شده بود و اکثر مرورگرها از آن پشتیبانی نمی کردند.
برای دستیابی به پیام رسانی real-time در وب، توسعه دهندگان از تکنیک های ناکارآمد مانند سرشماری AJAX و سرشماری های طولانی مدت و فناوری هایی مانند رویدادهای server-sent که به صورت گسترده توسط مرورگر ها اجرا نشده اند، استفاده کردند.
SignalR برای حل این مشکل و پشتیبانی آسان از قابلیت های real-time در پشته ASP.Net با ایجاد کتابخانه های server-and client-side که پیچیدگی این فناوری هارا از بین می برد، ایجاد شده است.
از طرف دیگر،SignalR بهترین پروتکل را برای استفاده ی اتصال مشخص بر اساس آنچه توسط سرور و مشتری پشتیبانی می شود را انجام می دهد.
سپس یک API سازگار برای ارسال و دریافت پیام در real-time (زمان واقعی) فراهم می کند. از آنجا که استفاده از آن بسیار آسان است ، توسعه دهندگان ASP.NET به سرعت SignalR را پذیرفتند ، و آن را به عنوان پشته ای برای توسعه ASP.NET درreal-time تبدیل کردند.
SignalR در طول زمان
در طول 5 سال چیزهای زیادی در وب می تواند تغییر کند. تقریباً همه برنامه های وب از jQuery استفاده می کردند، بنابراین وابسته بودن کلاینت SignalR JavaScript به jQuery نیز بسیار آسان بود.
پیش از اینکه پروتکل WebSocket به طور گسترده توسط مرورگرها مورد قبول واقع شود، SignalR شامل منطق پیچیده ای بود که بر مدیریت پروتکل ها و راه حل های مختلف برای دستیابی به پیام رسانی در real-time وب متمرکز شده بود.
با نگاهی به سال 2018 می فهمیم که بسیاری از قابلیت های jQuery را می توان با جاوا اسکریپت خیلی ساده به دست آورد. همچنین فریمورک های full-fletched front-end مانند Angular، React و Vue جایگزین jQuery به عنوان پایه های جدید برنامه های single-page (تک صفحه ای) یا (SPA) ساخته شده اند. WebSockets در همه مرورگرهای اصلی موجود اند واکنون جزو استاندارد ارتباطات وب در real-time هستند.
ویژگی های دیگری نیز در SignalR برای سهولت استفاده مانند اتصال مجدد اتوماتیک و turnkey scale-out در نظر گرفته شده بود، اما در نهایت موجب اضافه شدن پیچیدگی و ناکارآمدی به فریمورک شدند.
بنابراین وقتی که ASP.Net مجددا طراحی شد و در مقابل یک ASP.Net Core سریع تر وکراس پلتفرم ایجاد شد، با در نظر گرفتن تمام آنچه که از دو نسخه اول SignalR آموخته بودند، وقت خود را برای بازنویسی SignalR از ابتدا صرف کردند. تا آن را در برابر پروتکل و فناوری های حمل و نقل جدید که در آینده ممکن است ظهور کنند، به اندازه ی کافی قابل توسعه سازند.
Transports
SignalR از تکنیک های زیر برای مدیریت ارتباطات درreal-time (به ترتیب بازگشت خوب) پشتیبانی می کند:
- WebSockets
- Server-Sent Events (رویداد های ارسال شده توسط سرور)
- Long Polling (نظرسنجی های طولانی)
SignalR به طور خودکار بهترین روش transport را که در ظرفیت سرور و سرویس گیرنده باشد، انتخاب می کند.
Transport به توسعه دهندگان این امکان را می دهد تا به جای نحوه ی ارسال پیام (یا تصمیم گیری برای استفاد از نقل و انتقال)، بر روند تجارت تمرکز کنند. SignalR میتواند به صورت پویا پشتیبانی نقل و انتقالات را ارزیابی کند. به عبارت دیگر، SignalR براساس قابلیت های سرویس گیرنده و سرور، به طور خودکار انتخاب می کند که کدام روش حمل و نقل (transport) مناسب تر می باشد.
برای مثال اگر WebSockets (کارآمدترین حمل و نقل) توسط سرور یا مرورگر پشتیبانی نمی شود، SignalR دوباره به سرورهای ارسال شده بازمی گردد. همچنین اگر رویدادهای Server-Sent پشتیبانی نشوند، SignalR دوباره در Long Polling ظاهر می شود.
وقتی SignalR ارتباطی برقرار می کند، برای تأیید زنده بودن اتصال شروع به ارسال پیام های زنده (keep-alive messages) می کند. اگر اتصال زنده(alive) نباشد، SignalR یک استثنا را ایجاد می کند.
از آنجا که SignalR در بالای حمل و نقل (transport) قرار دارد. به توسعه دهندگان این امکان را می دهد تا بدون توجه به اینکه SignalR از چه حمل و نقلی استفاده می کند، به روشی ثابت کار کنند.
Hubs
SignalR از hubs (مراکز) برای ارتباط بین مشتری و سرور استفاده می کند.
هاب یک pipeline سطح بالا است که به مشتری و سرور اجازه می دهد تا روش های یکدیگر را فراخوانی کنند. SignalR بطور خودکار ارسال از مرزهای دستگاه را کنترل می کند و به مشتریان اجازه می دهد تا روش های موجود در سرور و بالعکس را فراخوانی کنند.
می توانید پارامترهای کاملاً تایپ شده را به متدها منتقل کنید، که مدل اتصال را امکان پذیر می کند. SignalR دو پروتکل built-in در هاب را فراهم می کند: یک پروتکل متنی مبتنی بر JSON و یک پروتکل دودویی مبتنی بر MessagePack . MessagePack به طور کلی پیام های کوچکتری در مقایسه با JSON ایجاد می کند.
مرورگر های قدیمی برای ارائه ی پشتیبانی از پروتکل MessagePack باید سطح XHR 2 را پشتیبانی کنند. هاب ها با ارسال پیام هایی حاوی نام و پارامترهای روش client-side (سمت مشتری)، کد clent-side را فراخوانی می کنند. اشیایی که به عنوان پارامترهای متد ارسال می شوند، با استفاده از پروتکل پیکربندی شده از لیست حذف می شوند.
مشتری سعی می کند نام را با روشی در کد client-side تطبیق دهد. و وقتی که مشتری یک تطابق را پیدا می کند متد را فراخوانی، و داده های پارامتر دلخواه را به آن منتقل می کند.
Reconnections (اتصال مجدد)
هنگام قطع اتصال ، ASP.NET SignalR به طور خودکار راه اندازی مجدد اتصال را انجام می دهد. قابلیت اتصال مجدد معمولا برای هر برنامه مختص خودش است. به همین دلیل ، ASP.NET Core SignalR مکانیسم اتصال مجدد خودکار پیش فرض را ارائه نمی دهد.
برای بیشتر سناریوهای یا طرح های رایج، مشتری فقط در صورت قطع اتصال یا قطع تلاش اتصال، باید دوباره به هاب متصل شود. برای انجام این کار، برنامه می تواند متوجه این رویداد ها شود و متود شروع را بر روی اتصال هاب فراخوانی کند.
Presence
یک نیاز معمول برای برنامه های real-time، ردیابی کردن آنلاین بودن کاربران می باشد. ASP.NET Core SignalR افزودنPresence به یک برنامه را آسان می کند. برای مثال یک روش اساسی برای افزودن presence به ASP.NET Core SignalR، ردیابی حافظه کاربران است.
از آنجا که هر شناسه ی کاربر می تواند به طور بالقوه بیش از یک اتصال به مرکز را داشته باشد، برنامه باید تعداد اتصالات هر کاربر را ردیابی کند. یعنی هر زمان که یک اتصال قطع یا وصل می شود، ConnectionOpened یا ConnectionClosed فراخوانی می شود. بر اساس تعداد اتصالات مرتبط کاربر با رویداد اتصال، متودها وضعیت را برمی گردانند تا نشان دهد که کاربر متصل شده یا خارج شده است.
پس وقتی که کاربران به برنامه چت می پیوندند یا آن را ترک می کنند یک پیام ظاهر می شود.
Azure SignalR Service
برای اینکه برنامه های ASP.NET Core که از SignalR استفاده می کنند در بیش از یک نمونه مقیاس بندی شوند، باید یک backplane تنظیم شود. به عنوان مثال از طریق backplane این ارتباط برقرار می شود تا اطمینان حاصل شود که پیام ها درست به مقصد می رسند، با صرف نظر از اینکه مشتریان به کدام نمونه متصل هستند.
یک روش بسیار ساده برای مقیاس کردن برنامه ASP.NET Core SignalR استفاده از سرویس جدید Azure به نام Azure SignalR Service است. سرویس SignalR مقیاس را برای شما کنترل می کند، بنابراین می توانید تعداد زیادی اتصالات را پشتیبانی کنید بدون نیاز به اینکه خودتان یک backplane تنظیم کنید.
نتیجه گیری
همان طور که دیدیم،افزودن ویژگی های real-time در وب به برنامه های چند پلتفرمی (cross-platform) شما با استفاده از ASP.NET Core SignalR آسان است. و همچنین با سرویس Azure SignalR، شما یک برنامه بازگشتی کاملاً مدیریت شده برای برنامه های بسیار مقیاس پذیر دارید.
مانند ASP.Net،SignalR که برای عملکرد بالا ساخته شده است و یکی از سریع ترین فریمورک های real-time می باشد.