Maison  >  Article  >  développement back-end  >  Comment diffuser des événements d'un serveur gRPC à tous les clients ?

Comment diffuser des événements d'un serveur gRPC à tous les clients ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 06:00:30775parcourir

How to Broadcast Events from a gRPC Server to All Clients?

Diffusion d'événements dans gRPC du serveur au client

Dans gRPC, lorsqu'un utilisateur se connecte à un serveur en tant que client, il est crucial de diffuser cet événement à tous les clients connectés. Pour y parvenir, vous pouvez utiliser soit un observateur côté serveur, soit une approche d'interrogation longue.

Observateur côté serveur

Le serveur peut maintenir une liste de personnes connectées. clients. Lorsqu'un nouveau client se connecte, son flux correspondant est ajouté à la liste. Pour diffuser un événement, le serveur parcourt simplement la liste et envoie l'événement à chaque flux. Cependant, cette approche nécessite que le serveur suive les clients connectés et gère les abonnements aux flux, ce qui peut devenir complexe.

Approche d'interrogation longue

L'interrogation longue offre une solution alternative . Chaque client établit un flux de longue durée avec le serveur. Le client envoie une requête au serveur et attend une réponse. Le serveur conserve la demande jusqu'à ce qu'un événement se produise. Lorsque l'événement se produit, le serveur répond au client, déclenchant le retour de son appel d'interrogation longue.

Voici un exemple utilisant l'interrogation longue :

<code class="python"># Server-side code
class UpdaterServer:
    def post_update(self, update):
        with self.condition:
            self.updates.append(update)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        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

# Client-side code
request = GetUpdatesRequest()
request.last_received_update = -1
while True:
    try:
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass</code>

Lorsqu'un nouvel événement se produit, le serveur appelle post_update(), qui informe tous les clients en attente. Les longs appels des clients reviennent ensuite avec les informations mises à jour.

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