Maison  >  Article  >  développement back-end  >  Comment implémenter un mécanisme de délai d'attente pour les appels RPC sans fin ?

Comment implémenter un mécanisme de délai d'attente pour les appels RPC sans fin ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 01:35:30510parcourir

How to Implement a Timeout Mechanism for Endless RPC Calls?

Mécanisme d'expiration dans les appels de procédure à distance (RPC)

RPC est un mécanisme permettant d'effectuer des appels de procédure à distance sur un réseau sans avoir à connaître le détails sous-jacents du réseau ou du système hôte. Un aspect important de RPC est la possibilité d’interrompre les appels qui prennent trop de temps à se terminer. Si un appel RPC ne dispose pas d'un mécanisme de délai d'attente, cela peut entraîner des blocages et une pénurie de ressources.

Comment mettre fin à un appel RPC sans fin

Si un appel RPC le fait n'a pas de mécanisme de délai d'attente intégré et que le serveur qu'il essaie d'appeler est fermé, vous pouvez implémenter un modèle de délai d'attente à l'aide de canaux.

  1. Créer un canal pour les erreurs : Initialiser un canal de capacité 1 pour recevoir les messages d'erreur.
  2. Démarrez une routine go pour effectuer l'appel RPC : démarrez une routine go qui appelle l'appel RPC et envoie toute erreur ou résultat au canal .
  3. Utiliser une instruction select pour le délai d'attente : Incluez une instruction select qui attend que le canal reçoive un message ou qu'un délai d'attente spécifié se produise.
  4. Gérer le message ou le délai d'attente du canal : Si le canal reçoit un message, traitez l'erreur ou le résultat. Si le délai d'attente se produit, concluez que l'appel a expiré.

Voici un exemple d'extrait de code utilisant ce modèle :

<code class="go">import "time"

c := make(chan error, 1)
go func() { c <- client.Call("Service", args, &result) } ()
select {
  case err := <-c:
    // use err and result
  case <-time.After(timeoutNanoseconds):
    // call timed out
}</code>

L'instruction select se bloquera jusqu'à ce que le client.Call revient ou le délai d'attente spécifié s'écoule. Si le délai d'attente se produit, vous pouvez supposer que l'appel a expiré et prendre les mesures appropriées.

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