gRPC في C#: أقوى من REST، ولكن ليس دائمًا

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

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

ابدأ الدورة

gRPC في C#: عندما يكون REST من الماضي وHTTP/1.1 بطيئًا

\n\n

تخيل أنك سائق فورمولا 1. سيارتك قادرة على التسارع إلى 380 كم/ساعة، لكنك تسير في زحام المدينة. لا معنى لذلك، أليس كذلك؟ تقريبًا هكذا يُستخدم gRPC في C# - أداة قوية للتواصل بين الخدمات - في أماكن كان بإمكان REST API العادي أن يفي بالغرض. ثم يتساءلون: "لماذا يصعب تصحيح الأخطاء؟ لماذا كل هذا الكود؟".

\n\n

دعنا نوضح متى يكون استخدام gRPC مبررًا حقًا، ومتى يكون من الأفضل البقاء على HTTP/1.1 الموثوق. تنبيه: gRPC ليس رصاصة فضية. إنه معزز صاروخي للمهام الصحيحة.

\n\n

ما هو gRPC ولماذا C# هي البيئة المثالية

\n\n

gRPC (استدعاء الإجراءات عن بُعد من Google) هو إطار عمل لاستدعاء الإجراءات عن بُعد، مبني على HTTP/2 و Protocol Buffers. بدلاً من JSON الضخم - تنسيق ثنائي مضغوط. بدلاً من طلب-استجابة واحد - تدفقات كاملة، تعدد إرسال واتصال ثنائي الاتجاه.

\n\n

لماذا C# gRPC قوي جدًا؟ لأن .NET Core صُمم منذ البداية للخدمات المصغرة عالية التحميل. عدم التزامن، Span<T>، انخفاض مستوى تخصيص الذاكرة - كل هذا يجعل مزيج C# + gRPC واحدًا من الأكثر أداءً في الصناعة.

\n\n
// مثال على ملف .proto بسيط\nsyntax = "proto3";\n\nservice OrderService {\n  rpc GetOrder (OrderRequest) returns (OrderResponse);\n  rpc SubscribeOrders (OrderFilter) returns (stream OrderUpdate);\n}\n\nmessage OrderRequest {\n  string order_id = 1;\n}\n\nmessage OrderResponse {\n  string id = 1;\n  double total = 2;\n  repeated string items = 3;\n}
\n\n

بعد توليد الكود عبر protoc أو حزمة Grpc.Tools، ستحصل على كود C# كامل يمكن استخدامه كأي دالة عادية.

\n\n

متى يكون gRPC في C# ضروريًا حقًا؟ 5 سيناريوهات قوية

\n\n

1. الخدمات المصغرة ذات التحميل العالي (1000+ طلب في الثانية)

\n\n

إذا كان نظامك يعالج آلاف الطلبات في الثانية، فإن كل كيلوبايت إضافي في JSON وكل RTT إضافي (زمن الرحلة ذهابًا وإيابًا) يتحول إلى خسارة مالية. gRPC في C# يعطي تسريعًا يصل إلى 7-10 مرات مقارنة بـ REST/JSON بفضل:

\n\n
    \n
  • التسلسل الثنائي (Protobuf - أصغر 3-5 مرات من JSON)
  • \n
  • تعدد إرسال HTTP/2 (قناة TCP واحدة لطلبات متعددة)
  • \n
  • غياب التكاليف الإضافية لتحليل الرؤوس
  • \n
\n\n

2. البث المباشر للبيانات في الوقت الفعلي

\n\n

هل تحتاج إلى نقل أسعار الأسهم، السجلات، بيانات استشعار IoT أو تحديثات واجهة المستخدم؟ Streaming gRPC C# هو خيارك. يتم دعم أربعة أنواع من التدفقات:

\n\n
    \n
  • Unary - طلب-استجابة كلاسيكي
  • \n
  • Server streaming - الخادم يرسل البيانات للعميل
  • \n
  • Client streaming - العميل يرسل حزمة بيانات للخادم
  • \n
  • Bidirectional streaming - تبادل مستمر ثنائي الاتجاه
  • \n
\n\n
// جزء الخادم من البث ثنائي الاتجاه\npublic override async Task SubscribeOrders(\n    IAsyncStreamReader<OrderFilter> requestStream,\n    IServerStreamWriter<OrderUpdate> responseStream,\n    ServerCallContext context)\n{\n    await foreach (var filter in requestStream.ReadAllAsync())\n    {\n        var update = new OrderUpdate \n        { \n            OrderId = filter.OrderId, \n            Status = "Shipped" \n        };\n        await responseStream.WriteAsync(update);\n    }\n}
\n\n

3. الخدمات المصغرة الداخلية لنفس الفريق

\n\n

gRPC غير مناسب لواجهات API العامة (دعم ضعيف للمتصفحات، تصحيح أخطاء معقد). لكن داخل المجموعة - إنه ناقل مثالي. إذا كنت تتحكم في كل من العميل والخادم، فإن gRPC على C# يوفر:

\n
    \n
  • كتابة قوية من خلال عقود .proto
  • \n
  • توليد تلقائي للعملاء
  • \n
  • دعم الإغلاق السلس ونشر الموعد النهائي

المدونات

توصيات الكتب