"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment pouvez-vous implémenter la diffusion d'événements serveur-client dans gRPC en utilisant une approche d'interrogation longue ?

Comment pouvez-vous implémenter la diffusion d'événements serveur-client dans gRPC en utilisant une approche d'interrogation longue ?

Publié le 2024-11-03
Parcourir:824

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

Diffusion d'événements dans gRPC du serveur vers les clients

Lors de la création d'applications impliquant plusieurs clients se connectant à un serveur, il est souvent nécessaire de diffuser des événements pour tous les clients connectés. Dans gRPC, il existe plusieurs approches pour y parvenir.

Une option à considérer consiste à utiliser une approche d'interrogation longue. Cela implique que les clients interrogent périodiquement le serveur pour obtenir des mises à jour. Lorsqu'un événement se produit, le serveur informe tous les clients connectés, déclenchant le retour de leurs appels d'interrogation avec les nouvelles informations.

Pour implémenter une approche d'interrogation longue en Python, considérez le code suivant (une implémentation similaire est possible dans d'autres langages comme 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

Dans cet exemple :

  • La méthode post_update() permet aux clients d'être informés des événements.
  • Le serveur maintient une liste de mises à jour et informe les clients lorsqu'une nouvelle mise à jour devient disponible.
  • Le client interroge le serveur périodiquement, en attendant les mises à jour.
  • Lorsque des événements se produisent, le serveur déclenche les appels d'interrogation du client pour revenir avec les informations mises à jour.

L'utilisation d'une approche d'interrogation longue garantit que tous les clients connectés reçoivent les événements diffusés et fournit un moyen fiable de communiquer les mises à jour à plusieurs parties.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3