Uso y análisis simple del grupo de conexiones httpclient
Todos sabemos que el proceso de establecer una conexión http es engorroso y requiere 3 apretones de manos y 4 saludos. Por otro lado, guardar el proceso de establecimiento de una conexión es aún más necesario en un proceso de alta concurrencia. Al mismo tiempo, similar a un grupo de subprocesos, siempre hay un límite superior en el número de subprocesos y los subprocesos fallan. Para el grupo de subprocesos, la cantidad de subprocesos y el tiempo de vencimiento de los subprocesos son limitados, porque cuando la tarea está inactiva, estos subprocesos inactivos ocuparán recursos del sistema, por lo que debemos liberar los subprocesos en tiempo de inactividad. De manera similar, para las conexiones http, se utilizarán conexiones tcp largas, pero mantener conexiones largas consume muchos recursos, especialmente para el lado del servidor, la cantidad de enlaces es limitada, por lo que también debemos liberar las conexiones que han estado inactivas durante un cierto tiempo. periodo de tiempo;
Tener una estimación correcta del sistema:
httpclient nos proporciona la clase PoolingHttpClientConnectionManager para ayudarnos a gestionar las conexiones (versión 4.5 y superiores). Cuando usamos httpclient, si configuramos este administrador de conexiones, lo usaremos para administrar conexiones por host;
Como siempre, el uso más simple comienza con el uso de un singleton:
De esta manera , cada vez que queramos usar una solicitud http, podemos hacer que el cliente de la herramienta la use
¿Por qué usar un singleton? De hecho, al usar HttpClients.custom().setDefaultRequestConfig(requestConfig).build() directamente; se usa el mismo grupo de conexiones, puede ver el código fuente en la compilación, hay un grupo de conexiones de forma predeterminada cuando no se configura ningún administrador. Como queremos administrar el grupo de conexiones, solo puede haber un administrador; de lo contrario, la administración será caótica, por lo que cuando lo usemos, solo necesitamos tener un CloseableHttpClient. Este cliente está configurado con una administración del grupo de conexiones, y es. usado cada vez Tienes que acudir a él para lograr el propósito de administrar la conexión; de lo contrario, escribe así:
Cada vez que se usa uno nuevo, se creará un nuevo cliente y cada cliente será independiente. por lo que tendrás que empezar desde cero cada vez que lo utilices.
De hecho, vi a alguien configurar un montón de cosas:
En cuanto al tercer punto, cuando vi a alguien implementando sus propias tareas de detección de tiempo, pensé, un marco maduro, todos No he pensado en esto, así que ve y mira si realmente hace esto. Creo que es una buena idea ver si hace eso. Efectivamente, el marco tiene esto en cuenta, pero no está activado de forma predeterminada. Primero, eche un vistazo al código fuente: en la clase HttpClientBuilder
Puede ver que hay una propiedad en evictExpiredConnections o. evictIdleConnections eso es cierto, se activará una detección por temporizador para cerrar la conexión, por lo que podemos aprovechar esto para abrirla:
La documentación oficial explica cómo usarlos, pero no explica por qué al presentarlos, por lo que a veces es mejor mirar Eche un vistazo al código fuente para comprender por qué se hace esto y cómo se hace. Si usa httpclient, primero puede ver si puede ayudarnos a lograrlo. Si no, hágalo usted mismo;