Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Introducción
Http.sys delegación es una característica de nivel de kernel agregada a versiones más recientes de Windows que permite transferir una solicitud desde la cola de http.sys del proceso receptor a la cola de http.sys de un proceso de destino con muy poca sobrecarga o latencia agregada. Para que la delegación funcione, al proceso receptor se le permite únicamente leer los encabezados de la solicitud. Si el cuerpo ha empezado a leerse o se ha iniciado una respuesta, se producirá un error al intentar delegar la solicitud. La respuesta no será visible para el proxy después de la delegación, lo que limita la funcionalidad de los componentes de afinidad de sesión y comprobaciones de estado pasivas, así como algunos de los algoritmos de equilibrio de carga. Internamente, YARP aprovecha el IHttpSysRequestDelegationFeature de ASP.NET Core.
Requisitos
Http.sys delegación requiere:
- del servidor Http.sys de ASP.NET Core
- Windows Server 2019 o Windows 10 (número de compilación 1809) o posterior.
Defectos
Http.sys delegación no se usará a menos que se agregue a la canalización de proxy y se habilite en la configuración de destino.
Configuración
La delegación de Http.sys se puede habilitar por cada destino al agregar la metadato de HttpSysDelegationQueue
al destino. El valor de estos metadatos debe ser el nombre de la cola de destino http.sys. La Dirección del destino se usa para especificar el prefijo de la URL de la cola http.sys.
{
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "http://*:80/",
"Metadata": {
"HttpSysDelegationQueue": "TargetHttpSysQueueName"
}
}
}
}
}
}
}
En la configuración del host, configure el host para que use el servidor Http.sys.
webBuilder.UseHttpSys();
En la configuración de la aplicación, use la sobrecarga de MapReverseProxy
que le permite personalizar la canalización. Además, puede agregar http.sys delegaciones llamando a UseHttpSysDelegation
.
app.MapReverseProxy(proxyPipeline =>
{
// Add the three middleware YARP adds by default plus the Http.sys delegation middleware
proxyPipeline.UseSessionAffinity(); // Has no affect on delegation destinations
proxyPipeline.UseLoadBalancing();
proxyPipeline.UsePassiveHealthChecks();
proxyPipeline.UseHttpSysDelegation();
});
Duración de la cola de delegación
Cuando YARP está configurado para usar la delegación para un destino, se crea un identificador en la cola de http.sys especificada. Este identificador se mantiene activo siempre y cuando existan los destinos que hacen referencia al mismo. La limpieza de estos identificadores se realiza durante la gc, por lo que es posible que la limpieza del identificador se retrase si termina en Gen2. Esto puede provocar problemas para algunos receptores durante el reinicio del proceso porque si intentan crear la cola durante el inicio, se producirá un error (porque todavía existe, ya que YARP tiene un identificador para él). Los receptores deben ser lo suficientemente inteligentes como para conectarse en su lugar y volver a configurar correctamente la cola. El servidor http.sys de ASP.NET Core tiene este problema.
YARP expone una manera de restablecer su identificador a la cola. Esto permite a los consumidores escribir lógica personalizada para determinar si o cuando se debe limpiar el identificador de la cola.
Ejemplo:
var delegator = app.Services.GetRequiredService<IHttpSysDelegator>();
delegator.ResetQueue("TargetHttpSysQueueName", "http://*:80");