16
Работа со статикой в Badoo Юрий Насретдинов, разработчик

Handling Static Files in Badoo by Yuriy Nasretdinov

Embed Size (px)

Citation preview

Page 1: Handling Static Files in Badoo by Yuriy Nasretdinov

Работа со статикой в Badoo

Юрий Насретдинов, разработчик

Page 2: Handling Static Files in Badoo by Yuriy Nasretdinov

Badoo• 205+ млн пользователей

• PHP-FPM: 40+ тыс запросов в сек

• 300 тыс регистраций в день

• 5 млн фото / видео в день

• 50 языков интерфейса

• 2 000+ серверов

Page 3: Handling Static Files in Badoo by Yuriy Nasretdinov

«Статика» в Badoo• Статика — JS / CSS / картинки (фотографии пользователей хранятся отдельно)

• 100 Мб статики в репозитории

• SSI includes

• Кросс-зависимости: JS подгружает JS и CSS

• Deploy 2 раза в день

Page 4: Handling Static Files in Badoo by Yuriy Nasretdinov

Версионирование• Не версионировать:

- полагаться на If-Modified-Since, E-Tag, …

• У всех файлов одна и та же версия: - при деплое рост трафика в 2 раза - полная инвалидация кеша клиента

• У каждого файла своя версия:- загружаются только изменения

Page 5: Handling Static Files in Badoo by Yuriy Nasretdinov

Нет версионирования• У всех файлов нет версий и они всегда запрашиваются по одному и тому же URL

• Браузеры очень кешируют статику

• Прокси-серверы кешируют статику

• Во время деплоя часть файлов может обновиться, а часть — нет

• Пользователи обычно не жмут Ctrl+F5

Page 6: Handling Static Files in Badoo by Yuriy Nasretdinov

Одна версия у всех файлов• Удобно: не требуется думать о версиях файлов в CSS / JS

• Надежно: не требуется анализировать зависимости, состояние всегда согласовано

• Неэффективное использование кеша клиента — при деплое весь кеш инвалидируется

Page 7: Handling Static Files in Badoo by Yuriy Nasretdinov

Пофайловая версионность• Маркеры version(filename) — явное версионирование файлов в CSS/JS

• Цепочка зависимостей:- A -> B -> C- поменялся A, нужно дать новую версию B и C

• Сложно следить за согласованностью версий

Page 8: Handling Static Files in Badoo by Yuriy Nasretdinov

Devel-окружение• Статика отдается через PHP и собирается «на лету»

• URL без version(…) отдают 404

• Переключатели:- включение сжатия- отключение debug-строк - (CSS only) замена #include на @import

Page 9: Handling Static Files in Badoo by Yuriy Nasretdinov

Deploy• PHP-скрипт по обработке и загрузке файлов

• Карты:- [filename => contents_md5] - [filename => version]

• Порядок действий: - составляем зависимости [filename => […]]- находим изменившиеся файлы - перегенерируем изменившиеся файлы и их зависимости

Page 10: Handling Static Files in Badoo by Yuriy Nasretdinov

Дополнительные возможности• Автоматическая генерация RTL-версии в

CSS

• Поддержка «include path» — можно писать include и URL до файлов с точностью до директории

• Include path — список директорий, в которых ищется файл; просматривается по порядку

Page 11: Handling Static Files in Badoo by Yuriy Nasretdinov

Пример// something.js !

#include "funcs.js" #include "virtual:config.phtml" !

var el = document .createElement('script'); !

el.src = 'version(app.js)';

Page 12: Handling Static Files in Badoo by Yuriy Nasretdinov

Пример

// something.css #include "head.css" !

.mydiv { background: url(version(i.png)); float: left; }

Page 13: Handling Static Files in Badoo by Yuriy Nasretdinov

Пример (RTL-версия)

// something.css #include "head.css" !

.mydiv { background: url(version(i.png)); float: right; }

Page 14: Handling Static Files in Badoo by Yuriy Nasretdinov

До: После:

Page 15: Handling Static Files in Badoo by Yuriy Nasretdinov

До: После:

Page 16: Handling Static Files in Badoo by Yuriy Nasretdinov

Спасибо за внимание! Вопросы.

Юрий Насретдинов http://habrahabr.ru/users/yourock/ [email protected]