Maison > Article > développement back-end > Comment diffuser des événements d'un serveur gRPC à tous les 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!