با سلام، در این مقاله قصد دارم تا شما عزیزان رو با مفاهیم تئوری مربوط به فریم ورک سیگنال که یکی از فریم ورک های پرکاربرد برای توسعه نرم افزار های RealTime است، آشنا کنم.
توضیحات رو با یک سوال آغاز میکنیم و بعد از آشنایی کامل با مفاهیم ابتدایی و ضروری به کدنویسی میپردازیم.
فریم ورک نام آشنای SignalR چه کاربردی داره؟
اگر توسعه دهنده Back-End باشید، قطعا تا به حال براتون سوال شده که اگر بخواهیم یک نرم افزار به گونه ای توسعه بدیم که به صورت آنی (RealTime) ، کلاینت های ما(صفحات نرم افزار ما) بر اساس رویداد های مختلف آپدیت بشن، باید چیکار کنیم؟
نمونه های مختلفی از نرم افزارهای RealTime در دنیای امروز ما قابل مشاهده هست. برای روشن تر شدن سوالمون به چند تا مثال میپردازیم:
· یک پیام رسان رو تصور کنید که به محض ارسال پیام از سمت مبدا، در دستگاه هوشمند مقصد پیام نمایش داده میشه.
· یک وبسایت که بدون رفرش توسط شما، در صفحات اون اطلاعات آپدیت میشه. مثل وبسایت های کارگزاری بورس یا وبسایت های نمایش لحظه ای نرخ ارز و ....
اگر با RestApi ها که مبتنی بر پروتکل HTTP هستند آشنا باشید، قطعا متوجه خواهید شد که از طریق هر RestApi(و هر آنچه که مبتنی بر پروتکل HTTP هست)، نمیتوان نرم افزار RealTime توسعه داد. اما چرا؟
به زبان ساده در پروتکل HTTP همیشه یک درخواست(Request) از سمت کلاینت به سرور ارسال میشه. اما وقتی ما بخوایم برعکس این اتفاق بیفته، یعنی سرور این امکان رو داشته باشه تا کلاینت ها رو از یک رویداد و یک تغییر با خبر کنه، در پروتکل http دست ما بسته است و سرور نمیتونه شروع کننده یک درخواست باشه.
حالا که با صورت مسئله کاملا آشنا شدید بپردازیم به راه حل:
اگر بخواهیم ارتباط پایداری میان کلاینت و سرور برقرار کنیم تا در زمان لازم هر یک از طرفین بتواند آغاز کننده یک تبادل پیام باشد، باید از پروتکل سوکت استفاده کنیم.
استفاده از سوکت به خودی خود شاید کمی دشوار باشه، برای همین فریم ورک هایی بر بستر سوکت توسعه داده شده که این اجازه رو به ما میده تا خیلی ساده تر و با حداقل درگیری با مفاهیم پایه بتونیم یک بستر تبادل اطلاعات سوکتی و RealTime رو پیاده سازی کنیم و یکی از این فریم ورک ها سیگنال هست.
اگر علاقه مندید تا به صورت پایه ای تر با سوکت و پروتکل Http آشنا بشید، میتونید روی لینک زیر کلیک کنید.
حالا که فهمیدیم سیگنال چه کاربردی داره سوال دیگه ای رو مطرح میکنیم:
سیگنال چجوری کار میکنه؟
همونطور که بالاتر اشاره کردیم، اگر بتونیم از طریق سرور، کلاینت های خودمون رو از یک رویداد مطلع کنیم، بخش عمده ای از مسئله ی RealTime بودن رفع شده.
سیگنال برای زبانهای برنامه نویسی معروف، به عنوان سرور و کلاینت توسعه داده شده و توسعه دهندگان زبانهای مختلف به سادگی میتوانند از سیگنال استفاده کنند.
بنابراین با روشهای بسیار ساده که کمی جلوتر به صورت عملیاتی به شما نشون خواهیم داد، بعد از برقراری ارتباط بین طرفین (Handshake) سرور میتونه یک تابعی در نرم افزار کلاینت و همینطور کلاینت یک تابع از نرم افزار سمت سرور رو در زمان لازم و با حداقل محدودیت فراخوانی کنه و کاملا با هم به تبادل اطلاعات بپردازند.(در پروتکل http فقط کلاینت میتونست یک تابع رو از طریق RestApi یا روشهای دیگه، بر روی نرم افزار سمت سرور فراخوانی کنه و یک جواب متقابل دریافت کنه، اما اینجا دو طرف کاملا آزاد هستند تا به هم پیام بفرستند.)
حالا نوبت میرسه به توضیحات جزئی تر
سیگنال به چه صورت امکان شروع یک درخواست رو برای هر دو طرف سرور و کلاینت فراهم میکنه و چرا در روشهای مبتنی بر HTTP این امکان وجود نداره؟
سیگنال و روشهای مبتنی بر HTTP هر دو بر بستر سوکت فعالیت میکنند، اما در سطح بالاتر از سوکت، از پیاده سازی های متفاوتی برخوردارند.
· نحوه عملکرد پروتکل HTTP به این صورت هست که در هر درخواست ابتدا کلاینت به سرور متصل شده و یک درخواست به سمت سرور ارسال و با دریافت پاسخ از سرور، ارتباط کاملا قطع میشود.
به زبان دیگر، چون سرور از آیپی ثابتی برخوردار است و نرم افزار سرور در حالت عادی همیشه در حال اجراست، هر زمان که کلاینت نیاز داشته باشد، یک Request به سرور ارسال میکند.
بنابراین در پروتکل HTTP ارتباط ماندگار عملا معنایی نخواهد داشت. در واقع HTTP یک پروتکل مبتنی بر سوکت با قوانین سطح بالاتری است.
· سیگنال مبتنی بر سوکت است، اما ارتباط در سیگنال به صورت پایدار برقرار میشود. یعنی ابتدا میان کلاینت و سرور یک Handshake رخ میدهد و سپس تا زمانی که شرایط لازم (مثل وصل بودن شبکه و موارد مشابه) برقرار باشد، ارتباط قطع نخواهد شد.
بنابراین در این ارتباط پایدار، کلاینت هر زمان که نیاز داشته باشد، به سرور درخواست خواهد داد و سرور هر زمان که بخواهد تابعی سمت کلاینت فراخوانی میکند.
(شاید بپرسید اگر سیگنال انقدر راحته، پس چرا از RestApi با محدودیت های ذکر شده استفاده میکنیم؟ جواب این سوال رو با مطالعه مقاله های مربوط به پروتکل HTTP و آشنایی با سوکت خواهید فهمید.)
در سیگنال کلاینت ها بر چه اساسی تفکیک میشن؟
در ارتباط با استفاده از سیگنال، طرفین ارتباط باید اطلاعاتی از طرف مقابل در اختیار داشته باشند. قاعدتا برای کلاینت، از طریق ادرس ip سرور، همواره امکان ارسال پیام به سرور مقدور خواهد بود. اما مسئله اصلی تشخیص کلاینت ها از طریق سرور است.
بعد از عملیات Handshake و شروع ارتباط ماندگار میان سرور و کلاینت که از طریق کلاینت آغاز میشود (به زبان ساده کلاینت به سرور برای ایجاد ارتباط درخواست میده) سرور به هر کلاینت یک Id منحصر به فرد تحت عنوان Connection Id اختصاص خواهد داد. توسعه دهنده سمت سرور این آیدی های مربوط به کلاینت های مختلف را در یک لیست نگهداری خواهد کرد.
هر زمان که نیاز داشته باشیم تا به یک کلاینت خاص از سمت سرور پیامی بفرستیم، از طریق این Connection Id به سادگی به کلاینت دسترسی خواهیم داشت.(به زبان ساده، سرور میتونه به یک کلاینت با سشن ایدی مشخص پیام بفرسته.) از آنجا که ارتباط بین کلاینت و سرور پایدار است، این Connection Id تا زمانی که به دلایل مختلف ارتباط قطع نشود اعتبار دارد.
پس از قطع ارتباط میان سرور و کلاینت، سرور Connection Id مربوط به کلاینت را از لیست خود حذف میکند. اگر نیاز به برقراری مجدد ارتباط باشد، کلاینت مجددا Handshake انجام داده و با Connection Id جدید ارتباط دائمی اتفاق میافتد.(قطعی ارتباط در سوکت یک امر اجتناب ناپذیر است. عواملی همانند قطعی اینترنت به صورت خواسته یا ناخواسته، پالیسی های امنیتی و ... میتواند موجب قطع شدن ارتباط سوکتی شود و با رفع مشکل مجددا ارتباط برقرار میشود.)
بنابراین تا زمانی که ارتباط قطع نشود، کلاینت از طریق ادرس IP به سرور و سرور از طریق Connection Id به کلاینت دسترسی دائمی دارد.
(Connection Id شناسه ای است که فریم ورک در اختیار ما قرار میدهد، و در بک گراند ماجرا ممکن است اطلاعات بیشتری همانند آیپی موقت کلاینت یا ... بدون اطلاع ما استفاده شود.)
در مقالات بعد، مطالبی که در این مقاله به صورت تئوری توضیح داده شد، کدنویسی میکنیم و بعد از کدنویسی های ابتدایی به توضیحات مباحث پیشرفته تر از جمله مدیریت کاربران و توکن دهی در سیگنال خواهیم پرداخت.
مقاله مرتبط بعدی (پیاده سازی سمت سرور SignalR)
شما میتوانید این مقاله را در وبسایت آموزشی من به آدرس زیر مشاهده نمایید.
برای پیگیری آموزش ها و مقالات بیشتر، به صفحه لینکدین و وبسایت من سر بزنید.