در gRPC، چهار نوع اصلی از روشهای فراخوانی سرویس وجود دارد که هر یک شیوه خاصی از ارتباط بین کلاینت و سرور را ممکن میسازد. این تنوع در مدلهای ارتباطی از ویژگیهای کلیدی gRPC است که آن را برای سناریوهای مختلف شبکهای، بهویژه در معماریهای میکروسرویسی، بسیار مناسب میسازد.
۱. Unary RPC
در این مدل، کلاینت یک درخواست واحد به سرور ارسال میکند و یک پاسخ واحد دریافت میکند. این سادهترین و رایجترین نوع RPC است و معادل فراخوانی یک تابع عادی با پارامتر ورودی و خروجی مشخص در نظر گرفته میشود.
rpc GetUser (UserRequest) returns (UserResponse);
کاربردها:
-
دریافت اطلاعات یک شیء خاص
-
ارسال یک فرم و دریافت نتیجه
-
اعتبارسنجی دادهها
ویژگیها:
-
سادهترین مدل پیادهسازی
-
پشتیبانی گسترده در بیشتر زبانها و فریمورکها
۲. Server Streaming RPC
در این مدل، کلاینت یک درخواست به سرور ارسال میکند، ولی سرور چندین پیام در پاسخ ارسال میکند. این مدل برای سناریوهایی کاربرد دارد که دادههای حجیم یا پیوسته باید در چند بخش به کلاینت برسند.
rpc ListUsers (Empty) returns (stream UserResponse);
کاربردها:
-
استریم لیست کاربران، لاگها، یا تراکنشها
-
ارسال اطلاعات پیوسته (مثلاً وضعیت سنسورها)
-
گزارشگیری مرحلهای یا زنده
ویژگیها:
-
کلاینت منتظر تمام پیامها میماند یا میتواند بهصورت غیرهمزمان بخواند
-
سرور میتواند ارسال داده را در طول زمان انجام دهد
۳. Client Streaming RPC
در این مدل، کلاینت چندین پیام به سرور ارسال میکند و سپس یک پاسخ واحد دریافت میکند. سرور تا زمان اتمام استریم کلاینت منتظر میماند و پس از پایان ارسال دادهها، یک پاسخ برمیگرداند.
rpc UploadUsers (stream UserRequest) returns (UploadStatus);
کاربردها:
-
ارسال دستهای دادهها مانند لیست کاربران برای درج یا بروزرسانی
-
آپلود فایل بهصورت قطعهقطعه
-
جمعآوری نتایج محاسبات از منابع مختلف
ویژگیها:
-
کلاینت کنترل زمان و ترتیب ارسال دادهها را دارد
-
سرور فقط یک بار پاسخ میدهد
۴. Bidirectional Streaming RPC
در این مدل، هم کلاینت و هم سرور میتوانند بهطور همزمان چندین پیام ارسال و دریافت کنند. این مدل قدرتمندترین حالت ارتباط است و برای ارتباطات زنده و پویا استفاده میشود.
rpc Chat (stream ChatMessage) returns (stream ChatMessage);
کاربردها:
-
پیامرسانی زنده (real-time chat)
-
انتقال دادههای سنسورها با پاسخهای لحظهای
-
سیستمهای هماهنگی بین چند نود
ویژگیها:
-
دوطرفه و همزمان
-
میتواند کاملاً غیربلوککننده باشد
-
نیازمند طراحی دقیق جریان کنترل پیامها
مقایسه انواع RPC
نوع RPC | ارسال کلاینت | دریافت سرور | مناسب برای |
---|---|---|---|
Unary | یک پیام | یک پیام | فراخوانیهای ساده و درخواستهای فوری |
Server Streaming | یک پیام | چند پیام | گزارشها، لیستها، اطلاعات پیوسته |
Client Streaming | چند پیام | یک پیام | آپلود دستهای داده یا جمعآوری ورودیها |
Bidirectional Streaming | چند پیام | چند پیام | چت، ارتباط زنده، هماهنگی نودها |
مثال ساده از سرور Bidirectional
def Chat(self, request_iterator, context):
for message in request_iterator:
yield ChatMessage(user="server", text="Echo: " + message.text)
جمعبندی
انتخاب نوع سرویس در gRPC باید بر اساس نیاز دقیق ارتباطی انجام شود. در مواردی که ساختار ارتباط ساده است، Unary مناسبترین گزینه است. در مقابل، زمانی که ارتباط پیچیده، حجیم یا پیوسته باشد، مدلهای استریمینگ به دلیل بهرهوری بالا و پویایی، ترجیح داده میشوند. قدرت اصلی gRPC در همین انعطافپذیری ارتباطی نهفته است.