إذا كنت تبحث عن طريقة لتحسين أداء وموثوقية واجهات برمجة التطبيقات الخاصة بك، فقد ترغب في التفكير في استخدام دفق gRPC. gRPC هو إطار عمل حديث ومفتوح المصدر يسمح لك بإنشاء خدمات فعالة وقابلة للتوسع باستخدام بروتوكولات البند والتجارة HTTP/2. البث هو واحدة من الميزات الرئيسية في gRPC التي تمكّنك من إرسال واستقبال عدة رسائل في اتصال واحد، دون انتظار كل استجابة.
في هذه المقالة، سأشرح ما هو دفق gRPC، كيف يعمل، ولماذا هو مفيد لواجهات برمجة التطبيقات الخاصة بك. سأوضح لك أيضًا كيفية استخدام أداة تُدعى apidog لاختبار وتصحيح خدمات دفق gRPC الخاصة بك. بنهاية هذه المقالة، سيكون لديك فهم أفضل لدفق gRPC وكيفية استخدامه في مشاريعك.
ما هو دفق gRPC؟
دفق gRPC هو وسيلة لإرسال واستقبال عدة رسائل في اتصال واحد، باستخدام HTTP/2 كبرتوكول النقل الأساسي. HTTP/2 هو إصدار أحدث من HTTP يدعم التعدد، مما يعني أن عدة طلبات واستجابات يمكن أن تُرسل عبر نفس اتصال TCP، دون حظر بعضها البعض. هذا يقلل من الفائض الناتج عن فتح وإغلاق الاتصالات، ويحسن زمن الاستجابة ومعدل نقل البيانات في واجهات برمجة التطبيقات الخاصة بك.
يسمح لك دفق gRPC باستخدام أربعة أنواع من أنماط الاتصال:
- أحادي (Unary): هذا هو النمط الأبسط والأكثر شيوعًا، حيث يرسل العميل طلبًا واحدًا ويتلقى استجابة واحدة من الخادم. هذا مشابه لطلب HTTP والاستجابة العادية.
- دفق الخادم (Server streaming): في هذا النمط، يرسل العميل طلبًا واحدًا ويتلقى عدة استجابات من الخادم. يمكن للخادم دفق الاستجابات كما تصبح متاحة، دون انتظار العميل لطلبها. هذا مفيد للسيناريوهات التي يحتاج فيها الخادم لإرسال كمية كبيرة من البيانات إلى العميل، أو في الحالات التي يحتاج فيها الخادم لدفع التحديثات إلى العميل في الوقت الحقيقي.
- دفق العميل (Client streaming): في هذا النمط، يرسل العميل عدة طلبات ويتلقى استجابة واحدة من الخادم. يمكن للعميل دفق الطلبات كما تصبح متاحة، دون انتظار الخادم للاعتراف بها. هذا مفيد للسيناريوهات التي يحتاج فيها العميل لتحميل كمية كبيرة من البيانات إلى الخادم، أو حيث يحتاج العميل لإرسال عدة معلمات إلى الخادم في طلب واحد.
- دفق ثنائي الاتجاه (Bidirectional streaming): في هذا النمط، يمكن للعميل والخادم إرسال واستقبال عدة رسائل في كلا الاتجاهين. يمكن إرسال الرسائل واستقبالها بشكل مستقل، دون اتباع ترتيب صارم. هذا مفيد للسيناريوهات التي يحتاج فيها العميل والخادم إلى إجراء محادثة مستمرة وديناميكية، أو حيث يحتاج العميل والخادم إلى تبادل البيانات بطريقة نظير إلى نظير.
كيف يعمل دفق gRPC؟
يعمل دفق gRPC عن طريق استخدام بروتوكولات البند وHTTP/2 لترميز ونقل الرسائل. بروتوكولات البند هي تنسيق تسلسل ثنائي يسمح لك بتعريف بنية وأنواع رسائلك في ملف مخطط. بروتوكولات البند مضغوطة وسريعة وسهلة الاستخدام، وتدعم التوافق عبر اللغات والمنصات المختلفة.
HTTP/2 هو بروتوكول ثنائي يدعم التعدد، والضغط، والتشفير. يسمح لكHTTP/2 بإرسال عدة رسائل عبر نفس الاتصال، باستخدام إطارات كوحدة أساسية للتواصل. يحتوي كل إطار على رأس يشير إلى النوع والطول ومعرف الدفق للإطار. معرف الدفق هو معرف فريد يربط إطارًا مع طلب أو استجابة معينة. كما يدعم HTTP/2 التحكم في التدفق ومعالجة الأخطاء، مما يساعد على ضمان موثوقية وكفاءة واجهات برمجة التطبيقات الخاصة بك.
لاستخدام دفق gRPC، تحتاج إلى تعريف خدمتك ورسائلك في ملف بروتوكولات البند، باستخدام بناء جملة gRPC. على سبيل المثال، إليك خدمة بسيطة تدعم مكالمات أحادية ودفق الخادم:
syntax = "proto3";
package example;
// خدمة تُرجع الوقت الحالي
service TimeService {
// مكالمة أحادية: تُرجع الوقت الحالي
rpc GetTime (GetTimeRequest) returns (GetTimeResponse) {}
// مكالمة دفق الخادم: تُرجع الوقت الحالي كل ثانية
rpc StreamTime (StreamTimeRequest) returns (stream StreamTimeResponse) {}
}
// رسالة تمثل طلب الحصول على الوقت الحالي
message GetTimeRequest {
// المنطقة الزمنية للوقت المطلوب
string timezone = 1;
}
// رسالة تمثل استجابة تحتوي على الوقت الحالي
message GetTimeResponse {
// الوقت الحالي بتنسيق ISO 8601
string time = 1;
}
// رسالة تمثل طلب دفق الوقت الحالي
message StreamTimeRequest {
// المنطقة الزمنية للوقت المطلوب
string timezone = 1;
}
// رسالة تمثل استجابة تحتوي على الوقت الحالي
message StreamTimeResponse {
// الوقت الحالي بتنسيق ISO 8601
string time = 1;
}
لتنفيذ خدمتك، تحتاج إلى استخدام مكتبة gRPC للغة البرمجة التي تختارها. يدعم gRPC العديد من اللغات، مثل C# وC++ وGo وJava وNode.js وPython وRuby والمزيد. كل لغة لديها واجهتها الخاصة وتقنيات لإنشاء واستهلاك خدمات gRPC. على سبيل المثال، إليك تنفيذ بسيط لـ TimeService في Python:
import grpc
import time
from concurrent import futures
from example_pb2 import GetTimeRequest, GetTimeResponse, StreamTimeRequest, StreamTimeResponse
from example_pb2_grpc import TimeServiceServicer, add_TimeServiceServicer_to_server
# فئة تنفذ TimeService
class TimeService(TimeServiceServicer):
# مكالمة أحادية: تُرجع الوقت الحالي
def GetTime(self, request, context):
# احصل على المنطقة الزمنية من الطلب
timezone = request.timezone
# احصل على الوقت الحالي في المنطقة الزمنية المطلوبة
time = get_current_time(timezone)
# أنشئ وأعد استجابة مع الوقت الحالي
response = GetTimeResponse(time=time)
return response
# مكالمة دفق الخادم: تُرجع الوقت الحالي كل ثانية
def StreamTime(self, request, context):
# احصل على المنطقة الزمنية من الطلب
timezone = request.timezone
# جولة لا نهائية
while True:
# احصل على الوقت الحالي في المنطقة الزمنية المطلوبة
time = get_current_time(timezone)
# أنشئ وعُد استجابة مع الوقت الحالي
response = StreamTimeResponse(time=time)
yield response
# انتظر ثانية واحدة
time.sleep(1)
# دالة تُرجع الوقت الحالي في منطقة زمنية معينة
def get_current_time(timezone):
# TODO: نفذ هذه الدالة
pass
# أنشئ خادم gRPC
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# أضف TimeService إلى الخادم
add_TimeServiceServicer_to_server(TimeService(), server)
# ابدأ الخادم على المنفذ 50051
server.add_insecure_port('[::]:50051')
server.start()
# انتظر الانتهاء
server.wait_for_termination()
لاستهلاك خدمتك، تحتاج إلى استخدام عميل gRPC للغة البرمجة التي تختارها. تستخدم عملاء gRPC "ستوب" للتواصل مع خوادم gRPC. يتم إنشاء "ستوب" من ملف بروتوكولات البند، وتقدم طرقًا تتوافق مع طرق الخدمة. على سبيل المثال، إليك عميل بسيط يستدعي TimeService في Python:
import grpc
from example_pb2 import GetTimeRequest, StreamTimeRequest
from example_pb2_grpc import TimeServiceStub
# أنشئ قناة gRPC للخادم
channel = grpc.insecure_channel('localhost:50051')
# أنشئ "ستوب" لـ TimeService
stub = TimeServiceStub(channel)
# مكالمة أحادية: احصل على الوقت الحالي بتوقيت UTC
request = GetTimeRequest(timezone='UTC')
response = stub.GetTime(request)
print(f' الوقت الحالي بتوقيت UTC هو {response.time} ')
# مكالمة دفق الخادم: دفق الوقت الحالي بتوقيت PST
request = StreamTimeRequest(timezone='PST')
responses = stub.StreamTime(request)
for response in responses:
print(f' الوقت الحالي بتوقيت PST هو {response.time} ')
لماذا تستخدم دفق gRPC؟
يوفر دفق gRPC العديد من الفوائد لواجهات برمجة التطبيقات الخاصة بك، مثل:
- الأداء: يقلل دفق gRPC من الفائض الناتج عن فتح وإغلاق الاتصالات، ويسمح لك بإرسال واستقبال عدة رسائل في اتصال واحد. هذا يحسن زمن الاستجابة ومعدل نقل البيانات في واجهات برمجة التطبيقات الخاصة بك، ويجعلها أكثر استجابة وكفاءة.
- الموثوقية: يستخدم دفق gRPC HTTP/2، الذي يدعم التحكم في التدفق ومعالجة الأخطاء. يسمح التحكم في التدفق لك بالتحكم في معدل نقل البيانات، وتجنب الازدحام وفائض البطاقات. تسمح معالجة الأخطاء لك بالكشف عن الأخطاء والتعافي منها، وإنهاء الاتصال بشكل سلس. تساعد هذه الميزات في ضمان موثوقية وقوة واجهات برمجة التطبيقات الخاصة بك، وتمنع فقدان البيانات وفسادها.
- المرونة: يسمح لك دفق gRPC باستخدام أنماط اتصال مختلفة، اعتمادًا على حالتك الاستخدام ومتطلباتك. يمكنك الاختيار بين الأحادي، دفق الخادم، دفق العميل، ودفق ثنائي الاتجاه، والتبديل بينها بسهولة. يمنحك هذا مزيدًا من المرونة والتحكم في واجهات برمجة التطبيقات الخاصة بك، ويسمح لك بالتعامل مع سيناريوهات وتحديات مختلفة.
- البساطة: يبسط دفق gRPC تطوير وصيانة واجهات برمجة التطبيقات الخاصة بك، باستخدام بروتوكولات البند ومكتبات gRPC. تسمح لك بروتوكولات البند بتعريف خدمتك ورسائلك بشكل واضح وموجز، وتوليد الشيفرة للغات ومنصات مختلفة. تسمح لك مكتبات gRPC بإنشاء واستهلاك خدمتك باستخدام واجهة برمجة تطبيقات متسقة وبديهية، والتعامل مع التفاصيل الأساسية للبث وHTTP/2 بدلاً منك. يجعل هذا الشيفرة الخاصة بك أكثر قابلية للقراءة وإعادة الاستخدام ونقلها، ويقلل من التعقيد وروتين واجهات برمجة التطبيقات الخاصة بك.
كيف تختبر وتصحيح خدمات دفق gRPC؟
يمكن أن يكون اختبار وتصحيح خدمات دفق gRPC تحديًا، خاصة إذا كنت تستخدم لغات ومنصات مختلفة. لحسن الحظ، هناك أداة يمكن أن تساعدك في ذلك: Apidog.
Apidog هي أداة قائمة على الويب تتيح لك اختبار وتصحيح خدمات دفق gRPC الخاصة بك، باستخدام واجهة بسيطة وبديهية. يدعم apidog العديد من اللغات، مثل C# وC++ وGo وJava وNode.js وPython وRuby والمزيد. كما يدعم Apidog أنماط الاتصال المختلفة، مثل الأحادي ودفق الخادم ودفق العميل ودفق ثنائي الاتجاه.
مع apidog، يمكنك:
- الاتصال بخادم gRPC الخاص بك، باستخدام قناة آمنة أو غير آمنة، وتحديد الخدمة والطريقة التي تريد استدعاءها.
- إرسال طلبات إلى خادم gRPC الخاص بك، باستخدام تنسيق JSON أو تنسيق ثنائي، وتحديد البيانات الوصفية والموعد النهائي لكل طلب.
- استقبال استجابات من خادم gRPC الخاص بك، باستخدام تنسيق JSON أو تنسيق ثنائي، وعرض البيانات الوصفية والحالة لكل استجابة.
- مراقبة أداء وحالة اتصال gRPC الخاص بك، باستخدام الرسوم البيانية والمخططات التي تظهر زمن الاستجابة ومعدل النقل والأخطاء في طلباتك واستجاباتك.
- تصحيح خدمة gRPC الخاصة بك، باستخدام السجلات والأثر التي تظهر التفاصيل والأخطاء في طلباتك واستجاباتك، وتسمح لك بتصفية والبحث عن أحداث معينة.
Apidog هي أداة قوية وسهلة الاستخدام يمكن أن تساعدك في اختبار وتصحيح خدمات دفق gRPC الخاصة بك، والتأكد من أنها تعمل حسب المتوقع.
الخاتمة
يعد دفق gRPC ميزة يمكن أن تجعل واجهات برمجة التطبيقات الخاصة بك أسرع وأكثر موثوقية، من خلال السماح لك بإرسال واستقبال عدة رسائل في اتصال واحد، باستخدام HTTP/2 وبروتوكولات البند. كما يقدم لك دفق gRPC المرونة والبساطة، من خلال السماح لك باستخدام أنماط اتصال ولغات مختلفة، ومن خلال تزويدك بواجهة برمجة تطبيقات متسقة وبديهية. يعد دفق gRPC اختيارًا رائعًا لواجهات برمجة تطبيقاتك، خاصة إذا كنت بحاجة إلى التعامل مع كميات كبيرة من البيانات، أو تحديثات في الوقت الحقيقي، أو تفاعلات معقدة.
إذا كنت ترغب في معرفة المزيد عن دفق gRPC، يمكنك مراجعة الوثائق الرسمية على https://grpc.io/docs. إذا كنت ترغب في اختبار وتصحيح خدمات دفق gRPC الخاصة بك، يمكنك استخدام Apidog، وهي أداة قائمة على الويب تتيح لك الاتصال، وإرسال، واستقبال، ومراقبة، وتصحيح خدمات دفق gRPC الخاصة بك، باستخدام واجهة بسيطة وبديهية. يمكنك تجربة apidog مجانًا.