3. Случайность
Каждый день мы что-то ищем в Google...
Request URL:
https://www.google.com/s?output=search...
accept-encoding: gzip, deflate, sdch
Response:
content-encoding: gzip
get-dictionary: /sdch/j_fzWU8F.dct
Bootstrapping
8. Теперь когда совсем интересно
SDCH протокол впервые был предложен в 2008 году (Velocity 2008 Web Performance and Operations Conference).
Цель протокола сжать HTTP ответы и таким образом улучшить производительность у пользователей с небольшой скоростью интернета.
9. Уменьшение времени передачи данных
•
Уменьшение размера это ключ к успеху
•
Gzip работает хорошо для сжатия индивидуальных ответов
•
Как насчет общих данных, которые присутствуют во всех ответах?
•
Передавать общие данные только 1 раз и пересылать только различные части ответа
11. Но ведь уже есть RFC3229 - Delta сжатие в HTTP?
•
Применимо только для одинаковых путей, что делает невозможным какое-то кеширование
12. Как бы проверить, что это даст в рамках инфраструктуры LinkedIn
Генерирует словари для статического контента
1
Оповещает о словарях поддерживающие клиенты через HTTP заголовки
2
Скачивает и хранит словари
3
При последующем запросе оповещает что словарь уже скачан
4
Кодирует содержимое ответа ч-з SDCH используя словарь и уменьшает передаваемый размер
5
Принимает и декодирует
6
14. Начинаем разбираться. Что положить в словарь?
Данные словаря находятся в публичном доступе поэтому берем все публичные сss и js файлы.
15. Собираем словарь
Как обычно с первого раза не работает :). Немного исправляем и что мы видим...
https://github.com/gtoubassi/femtozip
Библиотека для сборки словаря
FemtoZip
18. Детальная метаданных словаря
Детальная метаданных словаря dictionary-metadata = 1#dictionary-header "n" dictionary-header = "domain" ":" value "n" | "path" ":" value "n" | "format-version" ":" value "n" | "max-age" ":" value "n" | "port" ":" <"> portlist <"> "n" portlist = 1#portnum portnum = 1*DIGIT
Полный словарь
dictionary-definition = dictionary-metadata payload
20. Вроде бы все отлично, но генерация словаря занимает довольно большое время ~10 часов.
21. ATS plugin
Что он должен делать
•определять что клиент поддерживает SDCH;
•предлагать клиенту скачать словарь;
•кодировать ответ согласно имеющемуся словарю;
22. Кодировка
для этого Google выбрал уже стандартизированный VCDIFF протокол.
http://code.google.com/p/open-vcdiff/
OPEN-VCDIFF
библиотека для кодировки и раскодировки для VCDIFF (RFC3284) формата
23. Кодирование VCDIFF
Замена длинных общих строк короткими инструкциями, необходимыми для клиента чтобы восстановить данные используя словарь.
25. Примеры для трех файлов
abook_remarketing_base_promo_en_US.css:
on disk: 4198 bytes
on wire: 809 bytes
registration_subs_upsell_en_US.css:
on disk: 9189 bytes
on wire: 3220 bytes
footer_en_US.css:
on disk: 1941 bytes
on wire: 1245 bytes
30. Кеширование, CDN
Требования:
должен уметь поддерживать пользовательский Vary хидер и различать элементы по нему.
Для SDCH это:
Vary: Avail-Dictionary
RESPONSE
content-encoding: gzip
content-encoding: sdch
vary: avail-dictionary
31. Кеширование, CDN
Требования:
не должен убирать SDCH значение из Accept- Encoding хидера (Akamai)
accept-encoding: gzip, deflate, sdch
32. Как часто обновлять словарь
Кеширование на короткий период, задержки для деплоймента
Кеширование, словарь все еще актуальный
33. Новый словарь
Возвращаем
get-dictionary: /sdch/j_fzWU8F.dct
и браузер скачивает его в оффлайн режиме
34. Безопасность
1.
Словарь хэшируется как на клиенте, так и на сервере
2.
Словарь действителен только для указанного домена и пути
35. Что нужно знать о Proxy и Firewall
•
Распространение нежелательного контента через словарь
•
Невозможность раскодировать словарь для проверки безопасности контента
•
Замена контента в закодированном SDCH ответе делает его не валидным
36. Словарь и ответ могут не содержать опасного контента, но раскодируемый результат?
37. Решение
1. Вырезать sdch из Accept-Encoding хидера :)
2. Реализовать sdch протокол (сложно, долго, затратно).
2.1 Производительность, для наших файлов ~400
микросекунд
40. Наши результаты
•
В среднем на 30% уменьшился размер передаваемых данных относительно Gzip.
•
Только файлы маленького размера проиграли относительно Gzip.
•
Уменьшилось время загрузки страниц, особенно в регионах с небольшой скоростью интернета.
•
Чем больше веб ресурс (чем больше файлов участвует в формировании словаря), тем лучше работает эта технология.