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\ngRPC هو إطار عمل RPC من Google يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. يدعم:
\n\n- \n
- الاستدعاءات الأحادية (مثل REST العادي) \n
- البث من الخادم \n
- البث من العميل \n
- البث ثنائي الاتجاه \n
في Swift، هناك مكتبة رسمية grpc-swift (Swift Package Manager) تسمح لكل من العميل والخادم بالعمل بلغة Swift. نعم، يمكنك كتابة خادم بلغة Swift مع gRPC — هذه ليست مزحة.
متى يكون gRPC في Swift أفضل صديق لك
\n\n1. الأحمال العالية وزمن الوصول المنخفض
\n\nإذا كان تطبيقك يرسل مئات الطلبات في الثانية (مثل التداول، الألعاب، إنترنت الأشياء)، فإن gRPC يفوز بفضل:
\n\n- \n
- HTTP/2 — تعدد الإرسال، ضغط الرؤوس \n
- البروتوكول الثنائي — protobuf يُحلل أسرع من JSON \n
- اتصالات Keep-alive — لا حاجة لفتح مصافحة TCP في كل مرة \n
مثال من الحياة الواقعية: تطبيق لمراقبة الخوادم. كل ثانية تصل 1000 مقياس. مع REST — 1000 اتصال TCP، مع gRPC — اتصال واحد طويل العمر. الفرق في استهلاك البطارية — أضعاف.
\n\n2. بث البيانات
\n\nREST مع نمط "طلب-استجابة" لا يعرف البث. أما gRPC فيعرف. إذا كنت بحاجة إلى:
\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 يعمل بشكل ممتاز مع هذا.
3. الميكروسيرفيسات بلغة Swift (نعم، هذا موجود)
\n\nيمكنك كتابة كل الواجهة الخلفية بلغة Swift (Vapor, Hummingbird) واستخدام gRPC للتواصل الداخلي بين الميكروسيرفيسات. المزايا:
\n\n- \n
- كود مشترك للنماذج (protobuf يُنشئ هياكل Swift) \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\n4. عندما يكون لديك نظام تعاقدي صارم
\n\nملفات Protobuf هي مصدر حقيقة واحد. وصفت API في .proto، أنشأت كودًا لـ Swift و Go و Python — والجميع يتحدثون نفس اللغة. لا مزيد من "أوه، هذا الحقل اختياري، وهذا ليس كذلك".
للفرق الكبيرة، هذا منقذ