google-chrome - tab - chrome extensions
Cuellos de Chrome al hacer mĂșltiples solicitudes al mismo recurso? (2)
Estoy intentando implementar encuestas largas por primera vez, y estoy usando objetos XMLHttpRequest para hacerlo. Hasta el momento, he tenido éxito en obtener eventos en Firefox e Internet Explorer 11, pero extrañamente, Chrome es el extraño en esta ocasión.
Puedo cargar una página y funciona muy bien. Realiza la solicitud de inmediato y comienza a procesar y mostrar eventos. Si abro la página en una segunda pestaña, una de las páginas comienza a ver retrasos en la recepción de eventos. En la ventana de herramientas de desarrollo, veo varias solicitudes con este tipo de sincronización:
"Stalled" tendrá un alcance de hasta 20 segundos. No sucederá en cada solicitud, pero generalmente ocurrirá en varias solicitudes en una fila, y en una sola pestaña.
Al principio pensé que esto era un problema con mi servidor, pero luego abrí dos pestañas de IE y dos de Firefox, y todas se conectan y reciben los mismos eventos sin pérdida de tiempo. Solo Chrome tiene este tipo de problemas.
Me imagino que esto es probablemente un problema con la forma en que estoy haciendo o atendiendo la solicitud. Como referencia, los encabezados de las solicitudes se ven así:
Connection: keep-alive
Last-Event-Id: 530
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
La respuesta es así:
HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: text/event-stream
Expires: Tue, 16 Dec 2014 21:00:40 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 16 Dec 2014 21:00:40 GMT
Connection: close
A pesar de los encabezados involucrados, no estoy usando el EventSource nativo del navegador, sino un polyfill que me permite establecer encabezados adicionales. El polyfill está utilizando XMLHttpRequest bajo las cubiertas, pero me parece que no importa cómo se realice la solicitud, no debe detenerse durante 20 segundos.
¿Qué puede estar causando que Chrome se estanque así?
Editar: La página chrome: // net-internals / # events de Chrome muestra que hay un error de tiempo de espera involucrado:
t=33627 [st= 5] HTTP_CACHE_ADD_TO_ENTRY [dt=20001]
--> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)
El mensaje de error se refiere a un parche agregado a Chrome hace seis meses ( https://codereview.chromium.org/345643003 ), que implementa un tiempo de espera de 20 segundos cuando se solicita el mismo recurso varias veces. De hecho, uno de los errores que el parche intenta corregir ( error número 46104 ) se refiere a una situación similar, y el parche está destinado a reducir el tiempo de espera.
Es posible que la respuesta (o solución alternativa) aquí sea simplemente hacer que las solicitudes se vean diferentes, aunque tal vez Chrome podría respetar el encabezado "sin caché" que estoy configurando.
Sí, este comportamiento se debe a Chrome bloqueando el caché y esperando ver el resultado de una solicitud antes de solicitar el mismo recurso nuevamente. La respuesta es encontrar la manera de hacer que las solicitudes sean únicas. Agregué un número al azar a la cadena de consulta, y todo está funcionando ahora.
Para referencia futura, esto fue Chrome 39.0.2171.95.
Editar : Desde esta respuesta, he llegado a entender que "Cache-Control: no-cache" no hace lo que pensé que hace. A pesar de su nombre, las respuestas con este encabezado pueden almacenarse en caché. No lo he intentado, pero me pregunto si usar "Cache-Control: no-store", que evita el almacenamiento en caché, solucionaría el problema.
agregando Cache-Control: no-cache, no-transform
funcionó para mí