Кoмпaния Facebook пoдвeлa итoги инициaтивы пo увeличeнию эффeктивнoсти лoкaльнoгo кэширoвaния нa стoрoнe web-брaузeрoв, прoвeдeннoй сoвмeстнo с рaзрaбoтчикaми Chrome и Firefox. Инжeнeры Facebook oбрaтили внимaниe нa тo, чтo oщутимaя чaсть зaпрoсoв связaнa с пoлучeниeм свeдeний o aктуaльнoсти прoкэширoвaннoгo стaтичeскoгo кoнтeнтa (в oснoвнoм изoбрaжeния, CSS и JavaScript-фaйлы), в прoцeссe пoвтoрнoй зaгрузки стрaниц или зaпрoсa идeнтичныx рeсурсoв при oткрытии нoвoй стрaницы. Внeсeнныe рaзрaбoтчикaми Firefox и Chrome измeнeния пoзвoлили нa 60% сoкрaтить числo зaпрoсoв стaтичeскиx рeсурсoв, чтo привeлo нe тoлькo к снижeнию нaгрузки нa сeрвeрную инфрaструктуру, нo и знaчитeльнo увeличилo скoрoсть зaгрузки стрaниц.
В чaстнoсти, зa счeт сoкрaщeния oтпрaвки лишниx сeтeвыx зaпрoсoв для прoвeрки aктуaльнoсти прoкэширoвaнныx брaузeрoм рeсурсoв, скoрoсть пoвтoрнoй зaгрузки стрaниц Facebook вoзрoслo нa 28%. При этoм измeнeния нe спeцифичны для Facebook и пoвышaют эффeктивнoсть рaбoты с любыми другими сaйтaми. Нaпримeр, рaзрaбoтчики Chrome прoвeли бoлee глoбaльнoe измeрeниe, в кoтoрoм выяснили, чтo пoслe внeсeния oптимизaций врeмя зaгрузки всex сaйтoв, нa кoтoрыx 90% рeсурсoв зaгружaются пoвтoрнo, сoкрaтилoсь нa 1.6 сeк. (тeстирoвaниe прoвoдилoсь при испoльзoвaнии 3G-сoeдинeния).
Инициaтивa по повышению эффективности кэширования была сделана после изучения в Facebook особенностей повторного запроса ресурсов в условиях первоначально заданного большого времени жизни в кеше. Для максимального использования кэширования на стороне браузера в Facebook URL каждого статического ресурса включает уникальный хэш от его содержимого, что позволяет выставлять изначально большое время жизни записей (заголовок «cache-control: max-age=» установлен в 365 дней, не заботясь о вопросе сброса кэша после изменения файла (если файл изменится, изменится и хэш URL, что приведет к загрузке файла независимо от времени жизни элемента к кэше).
Проблема оказалась в том, что несмотря на большое время жизни, браузеры продолжают достаточно интенсивно отправлять проверочные запросы, оценивая время модификации файла. В частности, при перезагрузке пользователем ранее открытой страницы перепроверка актуальности всех ресурсов выполняется независимо от того, истекло время жизни записи в браузерном кэше или нет. В результате, несмотря на выставление времени жизни статических ресурсов в 365 дней, в 2014 году около 60% всех запросов к Facebook приводило к выводу ответа с кодом 304 (файл не изменился). В обращениях пользователей Chrome подобных проверочных запросов было 63%, Firefox — 13%, IE — 14%, Safari — 22%.
Как видно из статистики, основной вклад во внеочередные проверки вносил браузер Chrome. Анализ кода показал, что Chrome всегда отправляет проверочный запрос, если обращение произведено с использованием метода POST. Разработчики аргументировали такое условие тем, что часто POST-запрос приводит к изменению страницы и необходимо всегда обеспечить показ самого актуального варианта. С другой стороны, операция авторизации в Facebook также проводится с отправкой данных методов POST, что приводило к перепроверке всех ресурсов при каждом входе пользователя в Facebook, игнорируя состояние кэша. Исправление этой особенности привело к тому, что число проверочных запросов от Chrome сократилась с 63% до 24%.
Продолжив анализ работы Chrome стало ясно, что Chrome считать перезагрузкой страницы ситуацию повторного открытия через элементы навигации (например, если пользователь возвращается к прошлой странице через кнопку назад), что другие браузеры не трактуют как перезагрузка. Исправление этой особенности существенно не повлияло на статистику и стало ясно, что причина повышенного количества проверочных запросов в нажатия пользователями кнопки «перезагрузить страницу». В ходе длительных дебатов был достигнут компромисс — не проводить повторную проверку для уже давно не изменявшихся ресурсов, но сохранить старое поведение и каждый раз проверять ресурсы, которые были изменены недавно. Изменения были приняты в Chrome 54 и привели к существенному ускорению повторной загрузки.
Что касается Firefox, то его разработчики не согласились менять давно устоявшееся поведение кнопки «перезагрузить страницу», но реализовали заголовок «cache-control: immutable», предоставив администраторам сайтов возможность управлять поведением при перезагрузке. При наличии данного заголовка браузер считает, что текущий ресурс никогда не меняется, и поэтому браузер не выполняет его повторные проверки. Изменение было принято в Firefox 49. Кроме того, для увеличения скорости загрузки страниц в Firefox 44 был реализован метод сжатия Brotli, который по сравнению с gzip позволяет сократить размер отдаваемой содержимое на 20%.