فراخوانی رویه‌ای دوردست

از ویکی‌پدیا، دانشنامهٔ آزاد

در محاسبه توزیع شده، یک فراخوانی رویه ی دوردست (به انگلیسی: remote procedure call)، زمانی رخ می‌دهد که یک برنامهٔ کامپیوتری موجب می‌شود یک رویه (ساب روتین) در یک فضای آدرس متفاوت (معمولاً روی کامپیوتر دیگری در یک شبکه مشترک) اجرا شود، این رویه طوری کدگذاری شده‌است که، انگار یک فراخوانی رویه ی نرمال محلی است، و برنامه‌نویس به‌طور آشکار جزئیات مربوط به تعامل دوردست را کد گذاری نمی‌کند. این بدان معنی است که برنامه‌نویس اساساً کد مشابهی را می‌نویسد؛ خواه این سابروتین در محل برنامهٔ اجرا شونده باشد، یا اینکه در دوردست باشد. این فرمی از تعامل کلاینت -سرور است (فرا خواننده کلاینت است و اجرا کننده سرور است) که به‌طور معمول از طریق یک سیستم انتقال پیغام از نوع درخواست -پاسخ پیاده‌سازی می‌شود. RPCها در الگوی برنامه‌نویسی شئ گرا، توسط فراخوانی متد دوردست (به انگلیسی:remote method invocation) نمایش داده می‌شوند. مدل RPC، نمایانگر سطحی از شفافیت محلی است. به‌طور خاص این که، رویه‌های فراخواننده، چه محلی باشند و چه دور دست، به میزان زیادی مشابه اند، اما معمولاً آنها عین هم نیستند، بنابراین، می‌توان فراخوان‌های محلی را از فراخوانی‌های دور دست افتراق داد. فراخوان‌های دوردست معمولاً به مراتب کندتر و نامطمئن تر از فراخوان‌های محلی هستند، بنابراین افتراق آنها مهم است.
آر پی سی‌ها، فرمی از ارتباطات بین پروسه‌ای هستند که در آن پروسه‌های مختلف دارای فضاهای آدرس متفاوت هستند: اگر روی فقط یک ماشین میزبان باشند، آنگاه اگرچه فضای آدرس فیزیکی یکسان است، اما دارای فضاهای آدرس مجازی مجزا هستند؛ و اگر روی میزبان‌های مختلف باشند، فضای آدرس فیزیکی متفاوت است. تکنولوژی‌های مختلف زیادی (معمولاً ناسازگار) برای پیاده‌سازی این مفهوم استفاده شده‌است.

فرستادن پیغام

آر پی سی، یک پروتکل درخواست- پاسخ است. یک RPC، به وسیله کلاینت شروع می‌شود، که یک پیغام درخواست را به یک سرور دوردست شناخته شده می‌فرستد، تا یک رویهٔ خاص را با پارامترهای داده شده اجرا کند. سرور دوردست پاسخی را به کلاینت می‌فرستد و نرم‌افزار، پروسهٔ خودش را ادامه می‌دهد. زمانیکه سرور در حال پردازش فراخوان است، کلاینت مسدود می‌شود (یعنی منتظر می‌ماند تا سرور پردازش را به پایان برساند)، سپس اجرا را از سر می‌گیرد. اگر کلاینت یک درخواست ناهمگام به سرور بفرستد، نظیر XMLHttpRequest، آنگاه کلاینت مسدود نمی‌شود. تفاوت‌ها و ریزه کاری‌های مختلف زیادی در پیاده‌سازی‌های مختلف وجود دارد، که منجر به طیفی از پروتکل‌های RPC ناسازگار مختلف می‌شود. یک تفاوت مهم بین فراخوانی‌های رویه ی دوردست و فراخوانی‌های محلی، این است که فراخوانی‌های دوردست، به دلیل مشکلات شبکه ای غیرقابل پیش‌بینی، می‌توانند دچار شکست شوند. همچنین، فراخواننده، به‌طور کلی، باید بدون اینکه بداند که آیا رویهٔ دوردست واقعاً فراخوان شده‌است یا خیر، چنین شکست‌هایی را حل و فصل کند. رویه‌های بی اثر (به انگلیسی: idempotent) (یعنی رویه‌هایی که اگر بیش از یکبار فراخوان شوند، تأثیر اضافه نخواهند داشت)، به راحتی مدیریت می‌شوند، اما این دشواری هنوز وجود دارد که کدی که رویهٔ دوردست را فراخوانی می‌کند معمولاً محدود به زیر سیستم‌های سطح- پایینی می‌شود که به دقت نوشته شده‌اند.

توالی وقایع

  1. کلاینت، قالب (به انگلیسی: stub) خود را فراخوانی می‌کند. این فراخوانی، یک فراخوانی رویه ی محلی است که دارای پارامترهایی است که به شیوه نرمال در داخل پشته قرار می‌گیرند.
  2. قالب کلاینت، پارامترها را در داخل یک پیغام بسته‌بندی می‌کند و یک فراخوانی سیستم انجام می‌دهد تا پیغام را بفرستد. بسته‌بندی پارامترها مارشالینگ (به انگلیسی: marshaling) نام دارد.
  3. سیستم عامل محلی کلاینت، پیغام را از ماشین کلاینت به ماشین سرور می‌فرستد.
  4. سیستم عامل محلی در ماشین سرور، پاکت‌های ورودی را به قالب سرور منتقل می‌کند.
  5. قالب سرور، پارامترها را از پیغام، از حالت بسته‌بندی خارج می‌کند. خارج کردن پارامترها از بسته‌بندی unmarshalling نام دارد.
  6. سرانجام اینکه، قالب سرور، رویهٔ سرور را فراخوانی می‌کند. پاسخ مورد نظر مراحل مشابهی را در جهت عکس، طی می‌کند.

منابع

مشارکت‌کنندگان ویکی‌پدیا. «Remote procedure call». در دانشنامهٔ ویکی‌پدیای انگلیسی، بازبینی‌شده در ۱۶ آوریل ۲۰۲۱.