Maison  >  Article  >  développement back-end  >  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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 21:40:02325parcourir

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 vers 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) :

<code class="python"># 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</code>

Dans cet exemple :

  • La méthode post_update() permet aux clients d'être avertis 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 périodiquement le serveur, en attente de mises à jour.
  • Lorsque des événements se produisent, le serveur déclenche les appels d'interrogation du client pour revenez 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn