Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 6079|Répondre: 4

[Source] Utiliser incorrectement HttpClient peut casser votre logiciel

[Copié le lien]
Publié sur 14/05/2022 17:11:56 | | | |
J’utilise incorrectement HttpClient depuis des années, mais finalement le cauchemar est arrivé. Mon site web était instable et mes clients étaient très en colère ; avec une simple solution, les performances se sont grandement améliorées et l’instabilité a disparu.



En même temps, j’ai en fait amélioré les performances de mon application avec une utilisation plus efficace des sockets.

Les microservices peuvent être un problème difficile à gérer. À mesure que de nouveaux services sont ajoutés et que les applications monolithiques se décomposent, il y a de plus en plus de chemins de communication entre les services. Il existe de nombreuses options de communication, mais HTTP est une option très populaire. Si le microservice est construit en C# ou dans un langage .NET, il y a de fortes chances que vous utilisiez déjà HttpClient.


Le problème réside

L’instruction using est une caractéristique C# qui gère des objets à usage unique. Une fois le bloc d’utilisation terminé, l’objet à usage unique (dans ce cas HttpClient) sort du champ d’application et est éliminé. Appelez la méthode de gestion et éliminez les ressources utilisées. C’est un schéma très typique en .NET que nous utilisons pour tout, de la base de données à l’écrivain de flux. En fait, tout objet avec une ressource externe qui doit être nettoyée utilise cette interface IDisposable.

Et on ne peut pas vous en vouloir de vouloir l’envelopper dans l’usage. Premièrement, il est considéré comme une bonne pratique de le faire. En fait, la documentation officielle de Microsoft utilise :


En général, lorsqu’on utilise un objet IDisposable, il doit être déclaré et instancié dans l’instruction using (utilisation).
Ensuite, tout le code que vous avez pu voir...... Le début de l’HttpClient vous indiquera d’utiliser le bloc d’instruction using, y compris la documentation la plus récente ASP.NET le site lui-même. Il en va de même dans l’article sur Internet.

Mais HttpClient est différent. Bien qu’il implémente l’interface IDisposable, il s’agit en réalité d’un objet partagé. Cela signifie qu’en coulisses, elle est réentrante et sûre du fil. Vous devriez partager une instance d’HttpClient tout au long de la durée de vie de votre application, plutôt que de créer une nouvelle instance à chaque exécution. HttpClient, voyons pourquoi.

Regarde par toi-même

Voici un programme simple pour démontrer HttpClient :

Ceci sera adressé à  http://aspnetmonsters.comOuvrez 10 requêtes et faites GET, nous imprimons simplement le code de statut, pour être sûrs que ça fonctionne. La sortie sera :

Attends, il y a autre chose !

Tout travail et tout est parfait pour le monde. Sauf que ce n’est pas le cas. Si nous sortons l’outil netstat et regardons le statut du socket sur la machine qui l’exécute, nous verrons :

C:\code\socket>NETSTAT.EXE
...
  Proto Adresse locale État de l’adresse étrangère
  TCP 10.211.55.6:12050 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12051 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12053 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12054 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12055 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12056 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12057 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12058 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12059 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12060 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12061 waws-prod-bay-017 :http TIME_WAIT
  TCP 10.211.55.6:12062 waws-prod-bay-017 :http TIME_WAIT
  TCP 127.0.0.1:1695 SIMONTIMMS742B :1696 ÉTABLI
...
Eh bien, c’est bizarre...... L’application a été fermée, mais il reste encore plusieurs de ces connexions ouvertes vers la machine Azure hébergeant le site ASP.NET Monsters. Ils sont dansTIME_WAITStatut, ce qui signifie que la connexion a été fermée d’un côté (le nôtre), mais nous attendons toujours de voir si d’autres paquets arrivent car ils ont peut-être été retardés quelque part sur le réseau. Voici un schéma du statut TCP/IP :



Windows restera connecté dans cet état pendant 240 secondes (comme défini en définissant [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay]). Windows a une limite à la rapidité avec laquelle vous pouvez ouvrir un nouveau socket, donc si vous manquez de pools de connexions, vous pouvez voir une erreur comme celle-ci :

Impossible de se connecter au serveur distant
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Chercher sur Google vous donnera de mauvais conseils pour réduire les délais de connexion. En fait, lorsqu’on exécute correctement sur un serveur avec HttpClient ou une application construite de manière similaire, réduire les délais peut entraîner d’autres conséquences négatives. Nous devons comprendre ce que signifie « juste » et résoudre le problème sous-jacent, pas bricoler avec des variables au niveau machine.

Répare ça

Si nous partageons une instance d’HttpClient, nous pouvons réduire le gaspillage de sockets en les réutilisant :

Notez que pour toute l’application, nous n’avons qu’une seule instance partagée. Le client Http fonctionne toujours comme avant (en fait un peu plus rapide grâce à la réutilisation des sockets). Netstat n’affiche désormais que :

TCP 10.211.55.6:12254 waws-prod-bay-017 :http ÉTABLI
Dans un scénario de production, mon nombre de sockets est en moyenne autour de 4000 et atteint un pic à plus de 5000, ce qui comprime effectivement les ressources disponibles sur le serveur et provoque le plantage du service. Après la mise en œuvre de ce changement, le nombre de sockets utilisés est passé d’une moyenne de plus de 4000 à un niveau constant inférieur à 400, généralement autour de 100.

Ceci fait partie d’un graphique de notre outil de surveillance qui montre ce qui se passe après avoir déployé un nombre limité de preuves de correction sur un nombre restreint de microservices.




C’était dramatique. Si vous avez un quelconque type de charge, vous devez garder ces deux choses à l’esprit :

Faites en sorte que votre HttpClient soit statique.
Ne jetez pas ou ne regroupez pas votre utilisation à moins que vous ne recherchez explicitement un comportement spécifique (comme causer une défaillance de votre service). HttpClient


résumé

Le problème d’épuisement des douilles avec lequel nous luttions depuis des mois a disparu, et nos clients organisent une parade virtuelle. Je ne peux pas sous-estimer à quel point cette erreur est peu évidente. Au fil des années, nous avons l’habitude de gérer des objets implémentés, IDisposable, et de nombreux outils de refactorisation comme R# et CodeRush vous avertissent même si vous ne le faites pas. Dans ce cas, éliminer HttpClient est la mauvaise approche. HttpClient implémente IDisposable et encourage les mauvais comportements, ce qui est malheureux

Langue source:La connexion hyperlientérée est visible.




Précédent:ASP.NET Core héberge les modèles en cours et hors processus dans IIS
Prochain:ASP.NET Core (XV) utilise HttpClient pour envoyer des requêtes HTTP
 Propriétaire| Publié sur 14/05/2022 17:25:22 |
Le TIME_WAIT TCP est une opération normale du protocole TCP, ce qui signifie qu’après le dernier FIN-ACK passé, le client attendra que le double temps de vie maximal (MSL) se termine pour s’assurer que le TCP distant reçoit un accusé de réception de sa demande de terminaison de connexion. Par défaut, le MSL est de 2 minutes. Vous pouvez rester dans TIME_WAIT jusqu’à 4 minutes, appelés deux MSL.

https://docs.microsoft.com/en-us ... t-from-netstat.html
Publié sur 14/05/2022 22:35:22 |
Apprendre à apprendre
Publié sur 19/05/2022 09:39:05 |
Tout est chinois, mais je ne comprends pas quand c’est relié en phrases
 Propriétaire| Publié sur 06/11/2023 07:16:05 |
test
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com