"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنك تنفيذ بث الأحداث من خادم إلى عميل في gRPC باستخدام نهج الاقتراع الطويل؟

كيف يمكنك تنفيذ بث الأحداث من خادم إلى عميل في gRPC باستخدام نهج الاقتراع الطويل؟

تم النشر بتاريخ 2024-11-03
تصفح:633

How can you implement server-to-client event broadcasting in gRPC using a long-polling approach?

بث الأحداث في gRPC من الخادم إلى العملاء

عند إنشاء تطبيقات تتضمن عملاء متعددين يتصلون بالخادم، غالبًا ما يكون من الضروري بث الأحداث إلى كافة العملاء المتصلين. في gRPC، هناك عدة طرق لتحقيق ذلك.

أحد الخيارات التي يجب مراعاتها هو استخدام نهج الاقتراع الطويل. يتضمن ذلك قيام العملاء باستقصاء الخادم بشكل دوري للحصول على التحديثات. عند وقوع حدث ما، يقوم الخادم بإعلام جميع العملاء المتصلين، مما يؤدي إلى استدعاءات الاستقصاء الخاصة بهم للعودة بالمعلومات الجديدة.

لتنفيذ نهج الاستقصاء الطويل في بايثون، ضع في اعتبارك الكود التالي (يمكن تنفيذ مماثل في لغات أخرى مثل Go):

# SERVER
class UpdaterServer(UpdaterServicer):
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            self.updates.append(updates)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        with self.condition:
            while self.updates[req.last_received_update   1:] == []:
                self.condition.wait()
            new_updates = self.updates[req.last_received_update   1:]
            response = GetUpdatesResponse()
            for update in new_updates:
                response.updates.add().CopyFrom(update)
            response.update_index = req.last_received_update   len(new_updates)
            return response

# SEPARATE THREAD IN CLIENT
request = GetUpdatesRequest()
request.last_received_update = -1
while True:
    stub = UpdaterStub(channel)
    try:
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass

في هذا المثال:

  • تسمح طريقة post_update() للعملاء بإخطارهم بالأحداث.
  • يحتفظ الخادم بقائمة التحديثات ويقوم بإخطار العملاء عندما يتوفر تحديث جديد.
  • يقوم العميل باستقصاء الخادم بشكل دوري، في انتظار التحديثات.
  • عند وقوع الأحداث، يقوم الخادم بتشغيل مكالمات الاستقصاء الخاصة بالعميل للعودة بالمعلومات المحدثة.

يضمن استخدام نهج الاقتراع الطويل حصول جميع العملاء المتصلين على أحداث البث ويوفر طريقة موثوقة لتوصيل التحديثات إلى أطراف متعددة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3