Chrome przestaje działać przy składaniu wielu żądań do tego samego zasobu?

Próbuję zaimplementować long polling po raz pierwszy i używam do tego obiektów XMLHttpRequest. Do tej pory udało mi się uzyskać wydarzenia w Firefoksie i Internet Explorerze 11, ale Chrome o dziwo jest Tym razem dziwny.

Mogę załadować jedną stronę i działa dobrze. To sprawia, że żądanie od razu i rozpoczyna przetwarzanie i wyświetlanie zdarzeń. Jeśli otworzę stronę na drugiej karcie, na jednej ze stron pojawią się opóźnienia w odbieraniu zdarzeń. W oknie dev tools, Widzę wiele żądań z tego rodzaju czasem:

zrzut ekranu

"Zablokowany" będzie trwał do 20 sekund. Nie dzieje się to przy każdym żądaniu, ale zwykle dzieje się to przy kilku żądaniach pod rząd i na jednej karcie.

Na początku myślałem, że to problem z moim serwerem, ale potem otworzyłem dwie karty IE i dwie karty Firefoksa, i wszystkie łączą się i odbierają te same zdarzenia bez przeciągania. Tylko Chrome ma takie problemy.

Myślę, że jest to prawdopodobnie problem z sposób, w jaki składam lub obsługuję prośbę. Dla odniesienia, nagłówki żądań wyglądają tak:

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

Odpowiedź wygląda tak:

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

Pomimo nagłówków, nie używam natywnego źródła zdarzeń przeglądarki, ale raczej polyfill, który pozwala mi ustawić dodatkowe nagłówki. Polyfill używa XMLHttpRequest pod pokrywami, ale wydaje mi się, że bez względu na to, jak wniosek jest składany, nie powinien przeciągać się na 20 sekund.

Co może być spowodowanie, że Chrome tak stoi?

Edit: strona chrome://net-internals/#events pokazuje, że wystąpił błąd limitu czasu:

t=33627 [st=    5]      HTTP_CACHE_ADD_TO_ENTRY  [dt=20001]
                --> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)

Komunikat o błędzie odnosi się do poprawki dodanej do Chrome sześć miesięcy temu (https://codereview.chromium.org/345643003 ), która implementuje 20-sekundowy timeout, gdy ten sam zasób jest żądany wiele razy. W rzeczywistości, jeden z błędów, który łatka próbuje naprawić (błąd numer 46104) odnosi się do podobnej sytuacji i łatka ma na celu skrócenie czasu oczekiwania.

Jest możliwe, że odpowiedź (lub obejście) polega na tym, aby żądania wyglądały inaczej, chociaż być może Chrome szanuje nagłówek "no-cache", który ustawiam.

Author: Quuxplusone, 2014-12-17

3 answers

Tak, to zachowanie jest spowodowane blokowaniem pamięci podręcznej przez Chrome i czekaniem na wynik jednego żądania przed ponownym żądaniem tego samego zasobu. Odpowiedzią jest znalezienie sposobu, aby prośby były unikalne. Dodałem losową liczbę do ciągu zapytania i wszystko działa.

Dla przyszłych odniesień, to był Chrome 39.0.2171.95.

Edit: od tej odpowiedzi zrozumiałem, że "Cache-Control: no-cache" nie robi tego, co myślałem, że robi. Pomimo nazwy, odpowiedzi z tym nagłówkiem mogą być buforowane. Nie próbowałem, ale zastanawiam się, czy użycie "Cache-Control: no-store", które zapobiega buforowaniu, naprawiłoby problem.

 28
Author: fluggo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 20:15:25

Dodawanie Cache-Control: no-cache, no-transform zadziałało dla mnie

 1
Author: activedecay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 23:19:06

Postanowiłem to uprościć i sprawdziłem nagłówki odpowiedzi na stronie, która nie miała tego problemu i zmieniłem moje nagłówki odpowiedzi, aby pasowały do ich:

Cache-Control: max-age=3, must-revalidate
 0
Author: DevDan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 14:23:03