gRPC في JavaScript: متى تستخدمه وكيف سيسرع مشروعك

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

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

ابدأ الدورة

لماذا لم يعد REST كافياً، ويظهر gRPC على المسرح؟



تخيل: أنت تكتب خدمة مصغرة على Node.js تتبادل البيانات كل ثانية مع عشر خدمات أخرى. REST API يتباطأ، تسلسل JSON يستهلك وحدة المعالجة المركزية، و WebSocket للاستدعاءات المعقدة لـ RPC يتحول إلى دراجة هوائية جهنمية. هل هذا مألوف؟



تعرف على gRPC في JavaScript. إنه ليس مجرد اختصار عصري، بل أداة حقيقية أنشأتها Google لاحتياجاتها الداخلية ثم فتحت المصدر. اليوم سنحلل متى تستخدم gRPC في مشاريع JS، ومتى يكون من الأفضل البقاء على REST القديم الجيد. تنبيه: gRPC ليس رصاصة فضية، لكنه في الأيدي الصحيحة يصنع المعجزات.



ما هو gRPC بكلمات بسيطة



gRPC هو إطار عمل لاستدعاء الإجراءات عن بُعد (Remote Procedure Call). تقوم بتعريف الخدمة وطرقها في ملف .proto، ثم تقوم بتوليد كود العميل والخادم بأي لغة مدعومة، بما في ذلك JavaScript. يعتمد على Protocol Buffers (protobuf) - تنسيق تسلسل ثنائي يعمل أسرع بعدة مرات من JSON.



الميزات الرئيسية لـ gRPC:

  • بروتوكول ثنائي - يتم نقل البيانات بتنسيق ثنائي مضغوط، وليس JSON نصي
  • HTTP/2 - تعدد الإرسال، ضغط الرؤوس، دفع الخادم
  • كتابة صارمة - عقد الخدمة موصوف في ملف proto، لا "ماذا لو جاء الحقل أم لا"
  • أربعة أوضاع عمل: unary (طلب-استجابة)، تدفق الخادم، تدفق العميل، تدفق ثنائي الاتجاه


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



1. بنية الخدمات المصغرة ذات التحميل العالي

إذا كانت خدماتك المصغرة على Node.js تتواصل مع بعضها البعض مئات المرات في الثانية، فإن gRPC يعطي مكسباً في الأداء يصل إلى 5-10 مرات مقارنة بـ REST. بفضل البروتوكول الثنائي، يقل حجم الحمولة، ويسمح HTTP/2 بعدم فتح اتصال جديد لكل طلب.



// proto/order.protosyntax = "proto3";

service OrderService { rpc CreateOrder (OrderRequest) returns (OrderResponse); rpc ListOrders (ListRequest) returns (stream OrderResponse);}

message OrderRequest { string user_id = 1; repeated string item_ids = 2;}

message OrderResponse { string order_id = 1; string status = 2; double total = 3;}

message ListRequest { string user_id = 1; int32 limit = 2;}


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

هل تحتاج إلى نقل أسعار الأسهم، سجلات الخادم، أو تحديثات الدردشة في الوقت الفعلي؟ REST مع polling هو من الماضي. التدفق ثنائي الاتجاه في gRPC يسمح للعميل والخادم بتبادل الرسائل في كلا الاتجاهين في وقت واحد عبر اتصال واحد.



// عميل على Node.js: الاشتراك في تدفق الأسعارconst grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const packageDef = protoLoader.loadSync('proto/stock.proto');const stockProto = grpc.loadPackageDefinition(packageDef).stock;

const client = new stockProto.StockService( 'localhost:50051', grpc.credentials.createInsecure());

// طلب التدفقconst call = client.SubscribePrices({ symbol: 'AAPL' });

call.on('data', (priceUpdate) => { console.log(`سعر جديد ${priceUpdate.symbol}: $${priceUpdate.price}`);});

call.on('end', () => { console.log('تم إنهاء التدفق');});


3. تطبيقات الجوال ذات حركة المرور المحدودة

كل كيلوبايت مهم، واستجابات JSON لواجهات REST API منتفخة بشكل غير لائق. Protobuf يضغط البيانات بنسبة 30-70% مقارنة بـ JSON. هذا أمر بالغ الأهمية للعملاء على React Native أو Flutter، حيث يُستخدم gRPC-web كوسيط.



4. بنية متعددة اللغات

هل لديك خلفية على Go، خدمة ML على Python، وواجهة أمامية على JavaScript (عبر gRPC-web)؟ gRPC يولد عمل

المدونات

توصيات الكتب