Sokan Academy

RPC تکنیکی برای فراخوانی توابع از راه دور

RPC تکنیکی برای فراخوانی توابع از راه دور

نگاهی کلی به Remote Procedure Call

فراخوانی رویه یا تابع از راه دور یا RPC تکنیکی برای ساخت سیستم های توزیع شده است. اساسا، این تکنیک به برنامه ای که روی یک سیستم است اجازه می دهد رویه ای را روی سیستم دیگری فراخوانی کند، بدون آن که بفهمد این رویه از روی سیستم دیگری درحال اجراست.

RPC Remote Procedure Call

RPC مخفف عبارت Remote Procedure Call است. در این عبارت سه کلمه استفاده شده است که برای فهم بهتر آن لازم است ابتدا این سه کلمه را با هم بررسی کنیم.

اصلی ترین کلمه در این عبارت Procedure است؛ در برنامه نویسی، رویه یک ماژول کد مستقل است که برخی از وظایف مشخص را انجام می دهد. Procedureها بخشی از کد برنامه هستند که در جاهای مختلفی از برنامه می توانند مورد استفاده قرار بگیرند. رویه (Procedure) را می توان یک تابع (Function) یا یک زیر روال (Sub-routine)  نیز نامید. اصلی ترین وظیفه ی یک رویه این است که کار کوچکی را به عنوان یک بسته ارائه دهد، تا توسعه دهنده یا برنامه نویس، هرجایی که به آن احتیاج داشت، آن را فراخوانی کند..

یک رویه (Procedure) ممکن است به عنوان تابع (Function)، زیر روال(Sub-routine) ، روال (routine)، روش (method) یا زیر برنامه (subprogram) نیز نامیده شود.

دومین کلمه Call است که در این مقاله ما آن را فراخوانی ترجمه کردیم. در کامپیوتر وقتی یک تکه کد یا برنامه ای را صدا می زنیم تا اجرا شود، درواقع آن را Call می کنیم. مثلا فرض کنید یک تابعی را در خط 20 تا 30 برنامه تان نوشته اید و حالا در خط 50 آن را Call می کنید تا کاری که خواسته اید را انجام دهد.

و کلمه ی سوم Remote است که در این مقاله "راه دور" ترجمه شده است. کامپیوتر راه دور کامپیوتری است که کاربر از نظر فیزیکی به آن دسترسی ندارد، اما ممکن است بتواند از راه دور، مثلا از طریق شبکه به آن دسترسی داشته باشد.

RPC یک سیستم انتقال اطلاعات نیست، بلکه روشی است برای اینکه به صورت کاملا مستقل از ویژگی های ارتباطی موجود روی سیستم بهره ببریم. این استقلال، یکی از نقاط قوت RPC به عنوان یک ابزار است. زیرا دیگر نیازی نیست در نرم افزارمان، کدهایی برای برقراری و مدیریت ارتباطات داشته باشیم.

RPC به صورت کاملا مستقل از سخت افزارها و پروتکل های ارتباطی شان و سیستم عامل، مورد استفاده قرار میگیرد. پس با این توضیحات، می توانیم نرم افزارمان را قبل از اینکه درباره ی این موارد و انتخاب شان تصمیم بگیریم، طراحی و تولید کنیم.

RPC یک تکنیک جدید نیست و اولین بار در سال 1976 توسط Nelson معرفی شد و سالها در محیط های دانشگاهی و مناطق تجاری مورد بهره برداری قرار گرفته است.

همچنین RPC، نوعی از ارتباط سرور و کلاینت است که بجای فراخوانی معمول HTTP از فراخوانی یک تابع استفاده می کند. این نوع از ارتباط سرور-کلاینت از IDL برای فراخوانی توابعی که باید فراخوانده شوند و نوع داده ای که نیاز دارد استفاده می کند.

IDL که شکل کوتاه شده ی عبارت interface description language یا interface definition language است، اصطلاحی عمومی است برای یک زبان که اجازه می دهد برنامه و یا شی ای از برنامه به گونه ای نوشته شود که قادر باشد با زبان دیگری ارتباط برقرار کند. IDLها با مشخص کردن رابط هایی (interfaces) که مستقل از زبان خاصی هستند، برقراری ارتباط بین بخش های مختلف برنامه را که با زبانهای مختلفی نوشته شده است، فراهم می کنند. مثلا بخش از برنامه که با C++ نوشته شده است می تواند با بخش دیگری که توسط JAVA نوشته شده است ارتباط برقرار کند.

⭐ پس فهمیدیم که RPC یک تکنیک بسیار قدرتمند برای ساختن برنامه های توزیع شده و برنامه های کلاینت-سروری است. و شاید جمله ی طلایی در تعریف این تکنیک این است که با استفاده از آن لازم نیست رویه ی فراخوانی شده با رویه ای که فراخوانی می کند در یک محل باشند. دو رویه می توانند برروی یک سیستم و یا روی سیستم های مختلفی قرار داشته باشند که توسط شبکه به هم متصل شده اند.

نگاهی به معماری RPC

مدل فراخوانی رویه از راه دور
  • درخواست کننده، پیامی را حاوی ورودی های تابعی که می خواهد فراخوانی کند، برای دریافت کننده ی درخواست می فرستد. و سپس صبر می کند تا نتیجه ی اجرای درخواستش را دریافت کند. و زمانی که پاسخِ همراه با نتیجه ی اجرای رویه را دریافت کرد، به کار خود ادامه می دهد.
  • دریافت کننده، زمانی که یک درخواست می آید، رویه فراخوانی شده کارش را شروع می کند و وقتی که نتایج اجرای رویه تمام شد، نتیجه ی حاصل شده به سمت درخواست کننده ارسال می شود. در اینجا از نظر درخواست کننده اتفاق خاصی رخ نداده و انگار که رویه ای را روی سیستم خودش اجرا کرده است.

چرا از عبارت رویه استفاده می کنیم؟ 

به این دلیل که این رویه ها می توانند یک تابع، یک بخش از برنامه و یا یک روندی در سمت دریافت کننده ی درخواست باشند.

⚠️ توجه:

RPC برای طراحی های کلاینت-سرور خیلی مناسب است. مثلا وقتی که کوئری به سمت سرور می رود و پاسخی را دریافت می کند. در این روند، تعامل بین درخواست دهنده و درخواست کننده به صورت متناوب برقرار است.

اگر بخواهیم به طور مفهومی بررسی کنیم، درخواست کننده (Client) و درخواست دهنده (Server) به طور همزمان باهم اجرا نمی شوند. بلکه فرآیند اجرا از درخواست کننده به سمت درخواست دهنده می پرد و دوباره برمی گردد.

روش کار RPC

دیاگرام یا فرآیندنمای روش کار RPC

مراحل زیر طی اجرای RPC اتفاق می افتد:

  1. یک کلاینت تکه کدی که روی خودش قرار دارد را اجرا کرده و پارامترهای مورد نیازش را به آن ارسال می کند.
  2. این تکه کد، پارامترهای رسیده را داخل یک پیام بسته بندی می کند. فرآیند بسته بندی، شامل تبدیل حالت نمایش پارامتر ها به یک قالب استاندارد و کپی کردن هر پارامتر در پیام نهایی است.
  3. تکه کد سمت کلاینت، پیام را به لایه ی انتقال، پاس می دهد. یعنی جایی که پیام را به ماشین مقصد (سرور یا ماشینی که قرار است رویه را اجرا کند) ارسال می کند.
  4. لایه ی انتقال موجود در سمت سرور، پیام را به تکه کدی روی سرور که وظیفه ی بازکردن بسته ی پیام را دارد، می فرستد و فرآیندهای مورد نظر، با روش های عادی برای فراخوانی رویه ها، روی سرور فراخوانی می شود.
  5. وقتی که رویه ی فراخوانی شده در سمت سرور، کارش را تمام کرد، نتیجه به تکه کد سروری برمی گردد (این کار هم با همان روش های معمول، برای بازگشت نتایج اجرای یک تکه کد انجام می شود) که وظیفه ی بسته بندی پیام را دارد. سپس تکه کد سمت سرور، پیام را به لایه ی انتقال تحویل می دهد.
  6. لایه ی انتقال سرور، پیام را به لایه ی انتقال کلاینت می فرستد، یعنی جایی که پیام را به تکه کد سمت کلاینت می فرستد.
  7. تکه کد سمت کلاینت، پیام را بازکرده و نتیجه ی اجرای درخواست را به رویه ی درخواست کننده می دهد.

RPC Runtime چیست؟

این سیستم، کتابخانه ای از روال ها و مجموعه ای از خدمات است و وظیفه ی اصلی آن، مدیریت کردن ارتباطات شبکه ای، به عنوان زیربنای سازوکار RPC است. در طول تماس RPC، کدهای سیستم run-time در کلاینت و سرور، الزامات برقراری ارتباط را فراهم کرده، سپس ارتباط را براساس یک پروتکل مناسب برقرار می کنند و از طریق این ارتباط، اطلاعات را بین کلاینت و سرور منتقل و در نهایت خطاهای احتمالی در ارتباط را مدیریت می کند.

تکه کد سمت کلاینت و سرور چیست؟ و چه وظیفه ای دارد؟

وظیفه ی این تکه کد، دور کردن برنامه نویس و کدی که می نویسد از پیچیدگی های موجود در این نوع از ارتباط است.

تکه کد سمت کلاینت وظیفه دارد:

  • رابطه ی بین فرآیند اجرا شده روی سیستم کلاینت و سیستم RPC run-time را مدیریت کند.
  • اطلاعاتی که قرار است ارسال شود را بسته بندی کند.
  • بسته های رسیده را باز کند.
  • پروتکل RPC run-time را فراخوانی کند.
  • در صورت دریافت درخواست مراحل لازم را برای مدیریت درخواست طی کند.

تکه کد سمت سرور باید: 

  • نقش رابط را، بین سیستم run-time ای که قرار است سمت سرور اجرا شود و سیستم مدیریت فرآیندهایی که روی سیستم عامل سرور وجود دارد را بازی کند.

کلاینت چطور می فهمد با چه کسی ارتباط برقرار کند و سرویس مورد نظر کجاست؟

انعطاف پذیرترین راه، استفاده از ساختار اتصال پویا یا همان Dynamic Binding است. یعنی سروری که قرار است به آن متصل شود را در اولین اجرای RPC، دریافت کند. در اولین اجرای تکه کد سمت کلاینت، با یک سرور تماس گرفته می شود تا آدرسی که قرار است با آن ارتباط برقرار کند را دریافت کند.

مزایای استفاده از RPC

RPC سطح مناسبی از Abstraction را برای ما فراهم می کند. Abstraction به صورت مفهومی به معنای حذف کردن چیزهایی است که در موضوع کار ما لزومی به دانستن آنها نداریم. به عنوان مثالی خارج از موضوع این مقاله فرض کنید قصد داریم سفارش طراحی داخلی یک ساختمان را به یک متخصص بدهیم. در این شرایط نیازی نیست درباره ی مصالح استفاده شده در ساخت آن ساختمان اطلاعاتی را به آن متخصص بدهیم. زیرا این اطلاعات هرچند در ساخت ساختمان بسیار مهم است ولی برای یک طراح داخلی اطلاعات اضافی به حساب می آید. در نتیجه با حذف این اطلاعات ما Abstraction انجام داده ایم. در RPC هم اطلاعاتی مثل جزئیات و پیچیدگی های انتقال پیام از طریق شبکه ی ارتباطی، از دید کاربر مخفی می شود و کاربر درگیر این سطح از جزئیات نخواهد شد.

RPC در اغلب موارد بسیاری از لایه های پروتکل ها را، برای بهبود عملکرد (Performance) حذف می کند. در اینباره بهبودهای عملکردی خیلی کوچک هم می تواند اهمیت بسیار زیادی پیدا کند. زیرا تعداد این ارتباط های RPC می تواند بسیار زیاد باشد.

زمانی که از RPC استفاه می کنیم، امکان استفاده و بهره بردن از برنامه ها در محیط های توزیع شده (Distributed) فراهم می شود و استفاده از برنامه ها دیگر محدود به استفاده های Local نمی شود.

با استفاده از کدهای RPC، احتمال اینکه به بازنویسی و توسعه ی مجدد کدها نیاز پیدا کنیم بسیار کم خواهد شد.

RPC از هر دو روش توسعه ی کد یعنی برپایه ی Process و Thread پشتیبانی می کند. در نتیجه امکان استفاده از آن در الگوهای مختلف نرم افزاری و نرم افزارهای مختلف گسترش می یابد.

 

در این مقاله سعی کردم تکنیک RPC را تا سطح مناسبی برایتان تشریح کنم. این سری مقاله ها را دنبال کنید، زیرا درحال کالبد شکافی دقیق و لایه به لایه ی پروتکلی به نام gRPC هستیم.

 

این محتوا آموزنده بود؟
فراخوانی پردازهrpcپردازهمعماری

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.