Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 6079|Respuesta: 4

[Fuente] Usar HttpClient incorrectamente puede romper tu software

[Copiar enlace]
Publicado en 14/5/2022 17:11:56 | | | |
He estado usando HttpClient incorrectamente durante años, pero al final llegó la pesadilla. Mi web era inestable y mis clientes estaban muy enfadados, y con una solución sencilla, el rendimiento mejoró mucho y la inestabilidad se eliminó.



Al mismo tiempo, de hecho mejoré el rendimiento de mi aplicación con un uso más eficiente del socket.

Los microservicios pueden ser un problema difícil de resolver. A medida que se añaden más servicios y se descomponen aplicaciones monolíticas, tienden a haber cada vez más vías de comunicación entre servicios. Hay muchas opciones de comunicación, pero HTTP es una opción muy popular. Si el microservicio está construido en C# o en cualquier lenguaje .NET, lo más probable es que ya estés usando HttpClient.


El problema radica

La sentencia using es una característica de C# que maneja objetos de un solo uso. Una vez que el bloque de uso está completo, el objeto de un solo uso (en este caso HttpClient) queda fuera de alcance y se elimina. Llama al método de eliminación y limpia cualquier recurso que se esté utilizando. Este es un patrón muy típico en .NET que usamos para todo, desde la base de datos hasta el escribador de flujos. De hecho, cualquier objeto con un recurso externo que deba limpiarse utiliza esa interfaz IDisposable.

Y no se te puede culpar por querer envolverlo en el consumo. En primer lugar, se considera una buena práctica hacerlo. De hecho, la documentación oficial de Microsoft utiliza:


En general, al usar un objeto IDisposable, debe declararse e instanciarse en la sentencia usando.
Segundo, todo el código que hayas visto...... El inicio del HttpClient te indicará que uses el bloque de sentencias usando, incluyendo la documentación más reciente ASP.NET el propio sitio. Lo mismo se dice en el artículo en Internet.

Pero HttpClient es diferente. Aunque implementa la interfaz IDisposable, en realidad es un objeto compartido. Esto significa que, tras bambalinas, es reentrante y seguro de hilo. Deberías compartir una instancia de HttpClient a lo largo de la vida útil de tu aplicación, en lugar de crear una nueva instancia para cada ejecución. HttpClient, veamos por qué.

Compruébalo tú mismo

Aquí tienes un programa sencillo para demostrar HttpClient:

Esto se dirigirá a  http://aspnetmonsters.comAbre 10 solicitudes y haz GET, solo imprimimos el código de estado para saber que funciona. La salida será:

¡Espera, hay más!

Todo trabajo y todo es lo correcto para el mundo. Excepto que no lo es. Si sacamos la herramienta netstat y miramos el estado del socket en la máquina que la ejecuta, veremos:

C:\code\socket>NETSTAT.EXE
...
  Dirección Local Proto Estado de Dirección Extranjera
  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 ESTABLECIDO
...
Bueno, es raro...... La aplicación ha cerrado, pero aún quedan muchas de estas conexiones abiertas a la máquina Azure que aloja la web de ASP.NET Monsters. Están enTIME_WAITEstado, lo que significa que la conexión ha sido cerrada en un lado (el nuestro), pero seguimos esperando a ver si llegan otros paquetes porque pueden haberse retrasado en la red en algún sitio. Aquí tienes un diagrama del estado de TCP/IP:



Windows permanecerá conectado en este estado durante 240 segundos (según se establece configurando [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay]). Windows tiene un límite en la rapidez con la que puedes abrir un nuevo socket, así que si te quedas sin pools de conexión, puede que veas un error como este:

No se puede conectar al servidor remoto
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Buscarlo en Google te dará un mal consejo sobre cómo reducir los tiempos de espera de conexión. De hecho, al ejecutarse correctamente en un servidor con HttpClient o una aplicación construida de forma similar, reducir los tiempos de espera puede tener otras consecuencias adversas. Necesitamos entender qué significa "correcto" y resolver el problema subyacente, no trastear con variables a nivel de máquina.

Arréglalo

Si compartimos una instancia de HttpClient, podemos reducir el desperdicio de sockets reutilizándolos:

Ten en cuenta que para toda la aplicación solo tenemos una instancia compartida. HttpClient sigue funcionando igual que antes (de hecho, un poco más rápido por la reutilización de sockets). Netstat ahora solo muestra:

TCP 10.211.55.6:12254 waws-prod-bay-017:http ESTABLECIDO
En un escenario de producción, mi recuento de sockets promedia alrededor de 4000 y alcanza un pico de más de 5000, comprimiendo efectivamente los recursos disponibles en el servidor y provocando que el servicio se bloquee. Tras implementar el cambio, el número de sockets en uso bajó de una media de más de 4000 a consistentemente menos de 400, normalmente alrededor de 100.

Esto forma parte de un gráfico de nuestra herramienta de monitorización que muestra lo que ocurre después de desplegar un número limitado de pruebas de corrección en un número selecto de microservicios.




Fue dramático. Si tienes algún tipo de carga, debes tener en cuenta estas dos cosas:

Haz que tu HttpClient sea estático.
No descartes ni empaquetes tu uso a menos que busques explícitamente un comportamiento específico (como provocar que tu servicio falle). HttpClient


resumen

El problema de agotamiento de los sockets con el que llevábamos meses lidiando ha desaparecido, y nuestros clientes tienen un desfile virtual. No puedo subestimar lo poco obvio que es este error. A lo largo de los años, hemos estado acostumbrados a lidiar con objetos implementados, IDisposable, y muchas herramientas de refactorización como R# y CodeRush realmente te avisan si no lo haces. En este caso, eliminar HttpClient es el enfoque equivocado. HttpClient implementa IDisposable y fomenta un mal comportamiento es desafortunado

Texto original en:El inicio de sesión del hipervínculo es visible.




Anterior:ASP.NET Core aloja los modelos en proceso y fuera de proceso en IIS
Próximo:ASP.NET Core (XV) utiliza HttpClient para enviar solicitudes HTTP
 Propietario| Publicado en 14/5/2022 17:25:22 |
El TIME_WAIT TCP es una operación normal del protocolo TCP, lo que significa que, tras pasar el último FIN-ACK, el cliente esperará a que pase el doble tiempo máximo de vida útil (MSL) para asegurarse de que el TCP remoto recibe un acuse de recibo de su solicitud de terminación de conexión. Por defecto, el MSL es de 2 minutos. Puedes quedarte en TIME_WAIT hasta 4 minutos, conocidos como dos MSLs.

https://docs.microsoft.com/en-us ... t-from-netstat.html
Publicado en 14/5/2022 22:35:22 |
Aprende a aprender
Publicado en 19/5/2022 9:39:05 |
Todo es chino, pero no lo entiendo cuando está conectado en frases
 Propietario| Publicado en 6/11/2023 7:16:05 |
prueba
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com