gRPC في Kotlin: متى تستخدمه وكيف لا تخطئ في الاختيار

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

gRPC في Kotlin: متى تستخدمه لتجنب الندم



تخيل: أنت تكتب خدمات مصغرة بلغة Kotlin، كل شيء يعمل، لكن الطلبات بينها أصبحت بطيئة. REST API الذي كنت تحبه يبدأ في إزعاجك - الكثير من التسلسل، الكثير من الحمل الزائد لـ HTTP. تبدأ بالبحث عن "طريقة سريعة للتواصل بين الخدمات المصغرة" وتصادف gRPC. وعلى الفور يطرح السؤال: "أليس هذا مبالغاً فيه؟ ربما أترك الأمر كما هو؟"



دعنا نفهم الأمر. gRPC في Kotlin ليس مجرد "بروتوكول آخر". إنه نهج مختلف تماماً للتفاعل بين الخدمات. إنه أسرع وأكثر صرامة وأقوى من REST، ولكنه أيضاً أكثر تعقيداً. في هذه المقالة، سأشرح متى يكون gRPC أفضل صديق لك، ومتى يكون من الأفضل استخدام REST القديم الجيد. وبالطبع، سأعرض كوداً حقيقياً بلغة Kotlin.



ما هو gRPC ولماذا يحظى بشعبية كبيرة في عالم Kotlin؟



gRPC هو إطار عمل لاستدعاء الإجراءات عن بُعد (RPC) من Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. إذا كان REST مثل إرسال الرسائل عبر البريد (كل طلب هو رسالة منفصلة)، فإن gRPC يشبه محادثة هاتفية مباشرة: سريعة، ثنائية الاتجاه، وبأقل تأخير.



لمطوري Kotlin، يعتبر gRPC مثيراً للاهتمام بشكل خاص للأسباب التالية:



  • تتكامل كوروتينات Kotlin بشكل ممتاز مع التدفقات غير المتزامنة لـ gRPC.
  • الكتابة الصارمة لـ protobuf - أخطاء أقل في وقت التشغيل.
  • دعم التدفق ثنائي الاتجاه - مثالي للدردشات والألعاب وتطبيقات الوقت الفعلي.


لكن لنكن صادقين: gRPC ليس ضرورياً في كل مكان. والآن سأوضح كيف تعرف ما إذا كان مشروعك يحتاجه أم لا.



متى تستخدم gRPC في Kotlin: 5 سيناريوهات قوية



1. الخدمات المصغرة ذات متطلبات الأداء العالية



إذا كانت خدماتك المصغرة تتواصل بعشرات الآلاف من الطلبات في الثانية، فإن gRPC يتفوق على REST بمعدل 2-5 مرات من حيث السرعة. كل ذلك بفضل التنسيق الثنائي لـ protobuf وتعدد الإرسال في HTTP/2.



مثال: لديك خدمة توصيات بلغة Kotlin يجب أن تعيد محتوى مخصصاً في غضون أجزاء من الثانية. REST مع JSON سيكون "ثقيلاً" - كل طلب يحتوي على أسماء الحقول والأقواس وغيرها من النفايات النصية. Protobuf ينقل الأرقام والسلاسل فقط دون تغليف إضافي.



// تعريف في ملف .protoservice Recommender {    rpc GetRecommendations (UserRequest) returns (RecommendationsResponse);}

message UserRequest { string user_id = 1; int32 max_results = 2;}

message RecommendationsResponse { repeated Item items = 1;}


الكود على جانب عميل Kotlin سيكون موجزاً:



val stub = RecommenderGrpc.newBlockingStub(channel)val request = UserRequest.newBuilder()    .setUserId("user_123")    .setMaxResults(10)    .build()

val response = stub.getRecommendations(request)println("تم استلام ${response.itemsCount} توصية")


2. تدفق البيانات في الوقت الفعلي



يدعم gRPC أربعة أنواع من التدفق: من الخادم، ومن العميل، وثنائي الاتجاه، وأحادي بسيط. في Kotlin، هذا مناسب بشكل خاص مع الكوروتينات - يمكنك تدفق البيانات كـ Flow.



مثال: خادم سجلات يرسل إدخالات جديدة إلى العميل في الوقت الفعلي.



// جزء الخادم بلغة Kotlinclass LogServiceImpl : LogServiceGrpcKt.LogServiceCoroutineImplBase() {    override fun streamLogs(request: LogRequest): Flow<LogEntry> = flow {        val logSource = getLogSource(request.logType)        logSource.collect { logEntry ->            emit(logEntry)        }    }}

// جزء العميلval stub = LogServiceGrpcKt.LogServiceCoroutineStub(channel)stub.streamLogs(LogRequest.newBuilder().setLogType("error").build()) .collect { log -> println("سجل جديد: ${log.message}") }


حاول فعل الشيء نفسه مع REST و WebSocket - سيكون الأمر معقداً وبطيئاً.



3. الأنظمة متعددة اللغات

المدونات

توصيات الكتب