Remote Procedure Call یک پروتکل ارتباطی نرمافزاری است که یک برنامه میتواند برای درخواست سرویس از برنامهای که در رایانه دیگری در شبکه قرار دارد بدون نیاز به درک جزئیات شبکه استفاده کند. RPC برای فراخوانی سایر فرآیندها در سیستم های راه دور همانند یک سیستم محلی استفاده میشود. فراخوانی رویه گاهی اوقات به عنوان فراخوانی تابع (function call) یا فراخوانی زیر روال (subroutine call) نیز شناخته می شود.
RPC از مدل کلاینت-سرور استفاده می کند. برنامه درخواست کننده یک کلاینت است و برنامه ارائه دهنده خدمات سرور است. مانند یک فراخوانی رویه محلی، یک RPC یک عملیات همزمان است که نیاز به تعلیق برنامه درخواست کننده تا زمان بازگشت نتایج از راه دور دارد. با این حال، استفاده از فرآیندهای سبک وزن یا چندنخی(multi thread) که از آدرس یکسانی استفاده می مکنند، امکان فراخوانی چندین RPC را به صورت همزمان فراهم میکند.
RPC چه کاری انجام می دهد؟
وقتی دستورات برنامهای که از چارچوب RPC استفاده میکنند در یک برنامه اجرایی کامپایل میشوند، یک stub در کد کامپایل شده گنجانده میشود که به عنوان نماینده کد RPC عمل میکند. هنگامی که برنامه اجرا می شود و فراخوانی رویه درخواست میشود، stub درخواست را دریافت میکند و آن را به یک برنامه کلاینت در رایانه محلی ارسال میکند. اولین باری که خرد کلاینت فراخوانی می شود، از یک name server آدرس سرور را درخواست میکند.
برنامه کلاینت از آدرس کامپیوتر راه دور و برنامه سرور آگاه است و پیامی را در سراسر شبکه ارسال می کند که RPC را درخواست میکند. به طور مشابه، سرور شامل یک برنامه و stub است که با خود RPC ارتباط دارد. پروتکلهای درخواست پاسخ به همین روش بازگردانده میشوند.
RPC چگونه کار می کند؟
هنگامی که یک RPC فراخوانی میشود، محیط فراخوانی به حالت تعلیق در میآید، پارامترهای رویه در سراسر شبکه به محیطی که رویه در آن اجرا می شود منتقل میشود و سپس رویه در آن محیط اجرا می شود.
هنگامی که رویه به پایان میرسد، نتایج به محیط فراخوانی بازگردانده میشوند، جایی که اجرا به گونه ای از سر گرفته میشود که گویی از یک فراخوانی رویه معمولی باز میگردد.
در طول یک RPC، مراحل زیر انجام می شود:
کلاینت stub کلاینت را میخواند. فراخوانی یک فراخوانی رویه محلی با پارامترهایی است که به روش معمولی روی پشته افزوده میشود.
stub کلاینت پارامترهای رویه را در یک پیام جمع میکند و برای ارسال پیام یک فراخوانی سیستمی برقرار می کند. بسته بندی پارامترهای رویه را مارشالینگ(marshalling) میگویند.
سیستم عامل محلی کلاینت پیام را از دستگاه مشتری به دستگاه سرور راه دور ارسال می کند.
سیستم عامل سرور بسته های دریافتی را به stub سرور ارسال می کند.
stub سرور پارامترهایی را – که unmarshalling نامیده می شود – را از پیام باز می کند.
هنگامی که روال سرور به پایان رسید، به stub سرور باز می گردد، که مقادیر بازگشتی را به یک پیام تبدیل میکند. سپس stub سرور پیام را به لایه انتقال، میدهد.
لایه انتقال پیام به دست آمده را به لایه انتقال کلاینت برمیگرداند، که این لایه پیام را به stub مشتری باز میگرداند.
stub کلاینت پارامترهای بازگشت را از حالت مارشال خارج میکند و اجرا به درخواست کننده برمیگردد.
انواع RPC
چندین مدل RPC و پیاده سازی محاسبات توزیع شده وجود دارد. یک مدل و پیاده سازی محبوب، محیط محاسباتی توزیع شده بنیاد نرم افزار باز (OSF) است. موسسه مهندسین برق و الکترونیک (IEEE) RPC را در ISO Remote Procedure Call Specification که ISO، ISO/IEC CD 11578 N6561، ISO/IEC، هست در نوامبر 1991 تعریف می کند.
نمونه هایی از تنظیمات RPC شامل موارد زیر است:
روش عادی کار که در آن کلاینت یک تماس برقرار می کند و تا زمانی که سرور پاسخ را برگرداند ادامه نمی یابد.
کلاینت یک تماس برقرار می کند و به پردازش خود ادامه می دهد. سرور پاسخ نمی دهد.
امکانی برای ارسال چندین تماس غیرانسدادی کلاینت به صورت دسته جمعی.
کلاینتهای RPC دارای یک امکان پخش هستند، یعنی می توانند پیام ها را به سرورهای زیادی ارسال کنند و سپس تمام پاسخهای حاصل را دریافت کنند.
کلاینت یک تماس کلاینت/سرور غیر مسدود کننده برقرار می کند. سرور سیگنال میدهد که تماس با فراخوانی یک رویه مرتبط با کلاینت تکمیل شدهاست.
RPC لایه انتقال و لایه کاربردی را در مدل ارتباطات شبکه Open Systems Interconnection (OSI) پوشش میدهد. RPC توسعه یک برنامه کاربردی که شامل چندین برنامه توزیع شده در یک شبکه است را آسانتر میکند. روش های جایگزین برای ارتباط کلاینت-سرور شامل صف پیام(message queue) و IBM’s Advanced Program-to-Program Communication (APPC) است.
مزایا و معایب RPC
اگرچه دارای طیف گسترده ای از مزایای است، مطمئناً سهمی از مشکلات وجود دارد که کسانی که از RPC استفاده می کنند باید از آن آگاه باشند.
در اینجا برخی از مزایای RPC برای توسعه دهندگان و مدیران برنامه ارائه شده است:
به کلاینتها کمک میکند تا از طریق استفاده سنتی از فراخوانی رویه در زبان های سطح بالا با سرورها ارتباط برقرار کنند.
میتوان در یک محیط توزیع شده و همچنین در محیط محلی استفاده کرد.
از مدلهای فرآیند گرا (process-oriented) و رشته محور(thread-oriented) پشتیبانی می کند.
مکانیسم داخلی ارسال پیام را از کاربر پنهان می کند.
بازنویسی و توسعه مجدد کد به راحتی امکان پذیر است.
انتزاع را ارائه میدهد، به عنوان مثال، ماهیت پیام رسانی ارتباطات شبکه از کاربر پنهان است.
بسیاری از لایههای پروتکل را برای بهبود عملکرد حذف میکند.
از سوی دیگر، برخی از معایب RPC شامل موارد زیر است:
کلاینت و سرور از محیط های اجرایی متفاوتی برای روتین های مربوطه خود استفاده میکنند و استفاده از منابع (مثلاً فایل ها) نیز پیچیدهتر است. در نتیجه، سیستمهای RPC همیشه برای انتقال حجم زیادی از دادهها مناسب نیستند.
RPC در برابر خطاها بسیار آسیب پذیر است زیرا شامل یک سیستم ارتباطی، ماشین دیگر و فرآیند دیگری میشود.
هیچ استاندارد یکنواختی برای RPC وجود ندارد. میتوان آن را به روشهای مختلفی پیاده سازی کرد.
RPC فقط مبتنی بر تعامل است، و به این ترتیب، هیچ گونه انعطافی را در مورد معماری سخت افزار ارائه نمیدهد.