Contexte délai de mise en œuvre sur chaque demande d'aide de golang
Je suis en train de gérer contexte délai d'attente pour chaque demande. Nous avons de serveur suivants structures:
Flux aperçu:
Aller Serveur: Fondamentalement, agit comme un [Reverse-proxy].Deux
Auth Server: Vérifier les demandes d'Authentification.
Serveur d'Application: de Base du traitement de la demande de la logique.
Maintenant, si le serveur d'Autorisation ne pouvez pas en mesure de traiter les demandes dans les délais prévus, alors je veux fermer la goroutine de la mémoire.
Voici ce que j'ai essayé:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, _ := http.NewRequest("GET", authorizationServer, nil)
req.Header = r.Header
req.WithContext(ctx)
res, error := client.Do(req)
select {
case <-time.After(10 * time.Second):
fmt.Println("overslept")
case <-ctx.Done():
fmt.Println(ctx.Err()) //prints "context deadline exceeded"
}
Ici, le contexte renvoie "date limite dépassée", si la demande n'est pas traitée dans les délais prévus. Mais Il continue à traiter cette demande et le retour de la réponse plus que de temps spécifié. Alors, Comment puis-je arrêter de demande de débit(goroutine), quand le temps dépassé.
Bien que j'ai également mis en œuvre complet de demande doit être traitée dans les 60 secondes avec ce code:
var netTransport = &http.Transport{
Dial: (&net.Dialer{
Timeout: 60 * time.Second,
}).Dial,
TLSHandshakeTimeout: 60 * time.Second,
}
client := &http.Client{
Timeout: time.Second * 60,
Transport: netTransport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
Donc ai-je besoin de séparer contexte des implémentations ainsi? Merci d'avance pour l'aide.
Note1: Ça va être génial, Si nous pouvons gérer délai sur toutes les demandes(goroutine) créé par le serveur HTTP, en utilisant le contexte.
OriginalL'auteur Avinash | 2017-04-10
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe dans votre code est très correcte et se comporte comme prévu.
Vous créer un contexte
5 seconds
délai d'attente. Vous passer à larequest
et d'en faire la demande. Disons que la requête retourne dans 2 secondes. Vous effectuez alors unselect
et attendez 10 secondes ou attendre que le contexte à la fin. Le contexte qui va toujours finir dans les 5 secondes entre le moment où il a été créé et sera également donner à cette erreur à chaque fois qu'il arrive à la fin.La
context
est indépendante de la demande et il va atteindre la date limite, à moins que, annulée précédemment. Vous annulez la demande quand la fonction se termine à l'aide dedefer
.Dans votre code, la requête prend votre temps d'attente en considération. Mais le
ctx.Err()
sera de retourdeadline exceeded
chaque fois qu'il atteint le délai d'attente. Puisque c'est ce qui se passe à l'intérieur de lacontext
. l'appel de ctx.Err() plusieurs fois de retour la même erreur.À partir du contexte de la documentation:
Dans votre code, le délai d'attente sera toujours atteint et ce n'est pas annulée, c'est pourquoi vous recevez
DeadlineExceeeded
. Votre code est correct sauf la partie select qui permet de bloquer jusqu'à ce que 10 secondes ou le contexte délai est atteint. Dans votre cas, toujours le contexte délai est atteint.Vous devriez vérifier la
error
renvoyé par laclient.Do
appel et ne pas vous soucier decontext
erreur ici. Vous êtes l'un contrôlant le contexte. Si la demande de délais d'attente, un cas vous devriez le tester bien sûr, puis une erreur approprié serait retourné pour vous de vérifier.Vous devriez essayer et de mettre en œuvre vous-même. De cette façon, vous pouvez comprendre ce qui se passe. Si vous ne vous en venez à débordement de pile. Nous ne sommes pas ici pour faire votre travail. Nous sommes ici pour vous aider à faire votre travail 😀
Ha Ha, j'ai mis en œuvre les tâches de toute façon. Merci pour aller clarification interne.
OriginalL'auteur Bogdan Iulian Bursuc