gRPC في Swift: متى ولماذا هو ضروري حقًا

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

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

ابدأ الدورة

gRPC في Swift: عندما لا يكون مجرد موضة، بل ضرورة

\n\n

تخيل: أنت تكتب تطبيق iOS للتحكم في منزل ذكي. يتم إرسال الأوامر كل ثانية، وتأخير 100 مللي ثانية يعتبر كارثة. أو أنك تبني خدمة بث، حيث ينتقل الفيديو والصوت والقياسات عن بعد في وقت واحد. هنا سيبدأ REST في "التعثر" والوقوف في الزاوية. تعرف على — gRPC في Swift.

\n\n

لكن لنكن صادقين: gRPC ليس رصاصة فضية. أحيانًا، JSON بسيط على HTTP/1.1 يعمل بشكل أفضل. في هذه المقالة، سنحلل متى يكون gRPC في iOS مبررًا، ومتى يكون من الأفضل ترك REST، وكيف يبدو ذلك في كود حقيقي بلغة Swift.

\n\n

لن أطيل الكلام. فقط ممارسة، أمثلة، وسيناريوهات محددة. هيا بنا.

\n\n

ما هو gRPC (باختصار شديد، لمن فاته)

\n\n

gRPC هو إطار عمل RPC من Google يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. يدعم:

\n\n
    \n
  • الاستدعاءات الأحادية (مثل REST العادي)
  • \n
  • البث من الخادم
  • \n
  • البث من العميل
  • \n
  • البث ثنائي الاتجاه
  • \n
\n\n

في Swift، هناك مكتبة رسمية grpc-swift (Swift Package Manager) تسمح لكل من العميل والخادم بالعمل بلغة Swift. نعم، يمكنك كتابة خادم بلغة Swift مع gRPC — هذه ليست مزحة.

\n\n

متى يكون gRPC في Swift أفضل صديق لك

\n\n

1. الأحمال العالية وزمن الوصول المنخفض

\n\n

إذا كان تطبيقك يرسل مئات الطلبات في الثانية (مثل التداول، الألعاب، إنترنت الأشياء)، فإن gRPC يفوز بفضل:

\n\n
    \n
  • HTTP/2 — تعدد الإرسال، ضغط الرؤوس
  • \n
  • البروتوكول الثنائي — protobuf يُحلل أسرع من JSON
  • \n
  • اتصالات Keep-alive — لا حاجة لفتح مصافحة TCP في كل مرة
  • \n
\n\n

مثال من الحياة الواقعية: تطبيق لمراقبة الخوادم. كل ثانية تصل 1000 مقياس. مع REST — 1000 اتصال TCP، مع gRPC — اتصال واحد طويل العمر. الفرق في استهلاك البطارية — أضعاف.

\n\n

2. بث البيانات

\n\n

REST مع نمط "طلب-استجابة" لا يعرف البث. أما gRPC فيعرف. إذا كنت بحاجة إلى:

\n\n
    \n
  • تلقي تحديثات أسعار العملات في الوقت الفعلي
  • \n
  • بث الصوت/الفيديو
  • \n
  • تلقي السجلات من الخادم فور ظهورها
  • \n
\n\n

إذن gRPC هو اختيارك. إليك كيف يبدو البث من الخادم بلغة Swift:

\n\n
// تعريف في .proto\nservice StreamService {\n    rpc SubscribeToUpdates(Empty) returns (stream Update) {}\n}\n\n// عميل بلغة Swift\nlet client = StreamServiceAsyncClient(channel: channel)\nlet updates = client.subscribeToUpdates(Empty())\n\nfor try await update in updates {\n    print("تم استلام تحديث: \\(update.message)")\n}
\n\n

لاحظ: for try await — هذا هو Swift Concurrency. gRPC-Swift يعمل بشكل ممتاز مع هذا.

\n\n

3. الميكروسيرفيسات بلغة Swift (نعم، هذا موجود)

\n\n

يمكنك كتابة كل الواجهة الخلفية بلغة Swift (Vapor, Hummingbird) واستخدام gRPC للتواصل الداخلي بين الميكروسيرفيسات. المزايا:

\n\n
    \n
  • كود مشترك للنماذج (protobuf يُنشئ هياكل Swift)
  • \n
  • كتابة صارمة للأنواع
  • \n
  • دعم مدمج للمهلات، إعادة المحاولة، موازنة التحميل
  • \n
\n\n
// خادم بلغة Swift\nfinal class GreeterProvider: GreeterAsyncProvider {\n    func sayHello(request: HelloRequest, context: GRPCAsyncServerCallContext) async throws -> HelloReply {\n        return HelloReply.with { $0.message = "مرحبًا، \\(request.name)!" }\n    }\n}
\n\n

هذا الكود هو خادم gRPC كامل يمكن تشغيله على أي خادم Linux/macOS.

\n\n

4. عندما يكون لديك نظام تعاقدي صارم

\n\n

ملفات Protobuf هي مصدر حقيقة واحد. وصفت API في .proto، أنشأت كودًا لـ Swift و Go و Python — والجميع يتحدثون نفس اللغة. لا مزيد من "أوه، هذا الحقل اختياري، وهذا ليس كذلك".

\n\n

للفرق الكبيرة، هذا منقذ

المدونات

توصيات الكتب