Инкрементальные
обновления  на  клиенте



Михаил  Корепанов,  разработчик  интерфейсов
Я.Субботник,  Рига,  6  апреля  2013
Обо  мне
      panyakor@yandex-­team.ru        @panyakor
                                        


●    Разработчик  интерфейсов  в  команде  Яндекс.Почты
●    Нравится  разбираться  в  новых  технологиях,
  особенно  если  они  позволяют  что-­то
  автоматизирвать  или  ускорить
●    Можете  спрашивать  про  JS,  CSS,  клиентскую  оптимизацию



  02
Яндекс.Почта
●    Больше  1  МБ  статики




  03
Яндекс.Почта
●    Больше  1  МБ  статики
●    Обновляется  2  раза  в  неделю




  04
Яндекс.Почта
●    Больше  1  МБ  статики
●    Обновляется  2  раза  в  неделю

●    От  версии  к  версии  меняется  не  так  много  кода  (особенно  в
  случае  хотфиксов)




  05
Что  уже  сделано  для
   ускорения  загрузки?
●    gzip

●    Кэширование
●    CDN
●    Фриз  JS/CSS/картинок
●    Параллельная  загрузка  ресурсов  через  XHR




   06
Этого  не  достаточно!
Даже  при  фризе  JS/CSS,  если  от  релиза  к  релизу  меняется
только  пара  строк,  кэш  для  ресурса  инвалидируется  полностью.




07
Инкрементальные  обновления
От  версии  к  версии  меняется  не  так  много  кода  (около  10%,  а  в
случае  хотфиксов  еще  меньше).


А  что  если  при  выходе  новой  версии  передавать  только
изменения?




08
Инкрементальные  обновления
Что  если  хранить  где-­то  старую  версию  (например  в  localStorage),
а  при  выходе  новой  передавать  только  diff  между  новой  и  той,

которая  уже  сохранена  у  пользователя?


А  дальше  просто  накладывать  патч  на  клиенте.




09
Библиотеки  diff  на  JS
●    Vcdiff  (https://github.com/plotnikoff/vcdiff.js)
●    google  diff  patch  match  (http://code.google.com/p/google-­diff-­match-­

  patch/)
●    jsdiff  (https://github.com/kpdecker/jsdiff)
●    pretty  diff  (https://github.com/austincheney/Pretty-­Diff)
●    jsdifflib  (https://github.com/cemerick/jsdifflib)




  10
Библиотеки  diff  на  JS
●    Vcdiff  (https://github.com/plotnikoff/vcdiff.js)
●    google  diff  patch  match  (http://code.google.com/p/google-­diff-­match-­
  patch/)
●    jsdiff  (https://github.com/kpdecker/jsdiff)  (в  5  раз  медленнее,  чем
  google  diff  patch  match)
●    pretty  diff  (https://github.com/austincheney/Pretty-­Diff)  (не  умеет
  патчить)

●    jsdifflib  (https://github.com/cemerick/jsdifflib)  (не  умеет  патчить)
  11
Размер  патча  (в  байтах)
     Vcdiff  (размер   Vcdiff  (размер   Vcdiff  (размер   google  diff  patch
       блока  3)         блока  10)        блока  20)           match

 13957                 3586              3431              9297

 865                   367               309               910

 4615                  1854              1736              6740




12
Время  наложения  патча  на
клиенте  (в  миллисекундах)
                                  IE  9   Opera  12   Firefox  19   Chrome

 vcdiff  (размер  блока  10)      8       5           5             3

     google  diff  patch  match   1363    76          43            35




13
Vcdiff
●    RFC3284  (2002)
●    Используется  Google  в  SDCH

●    Используется  в  "Delta  encoding  in  HTTP"  (RFC3229)


  Сравнивает  строки  поблочно.  Размер  блока  по  умолчанию  —  20
  байт




  14
Храним  JS/CSS  на  клиенте
Храним  в  localStorage.


Каждый  ресурс  —  отдельный  ключ.


jane.js — 6.18.7@...
jane.version — 6.18.7




15
При  сборке
      Генерим  патчи  для  каждого  ресурса  для  предыдущих  3-­х  версий.
      В  index.html  инлайн  скриптом  вставляем  список  версий,  для
      которых  у  нас  есть  патчи:


01. oldVersions = {

02.        "jane": ["6.19.4", "6.18.7", "6.17.5"],
03.        "mail": ["6.19.7", "6.18.8", "6.17.6"]
04. }

      16
Формат  файла  с  патчами
01. [
02.        {

03.            "k": "jane.css",
04.            "p": [patch],
05.            "s": 4554
06.        }
07. ]


      17
Формат  файла  с  патчами
"k"  —  ключ  ресурса  в  LS.


"p"  —  патч  для  ресурса,  который  сгенерировал  Vcdiff.


"s"  —  чексумма  для  ресурса  актуальной  версии  по  алгоритму
Флетчера.




18
Почему  алгоритм  Флетчера?
●    Быстрый
●    Компактный
●    Легок  в  реализации




  19
При  выходе  новой  версии
●    Смотрим,  что  у  пользователя  в  LS




  20
При  выходе  новой  версии
●    Смотрим,  что  у  пользователя  в  LS
●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли

  эта  версия  в  oldVersions




  21
При  выходе  новой  версии
●    Смотрим,  что  у  пользователя  в  LS
●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли

  эта  версия  в  oldVersions
●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии




  22
При  выходе  новой  версии
●    Смотрим,  что  у  пользователя  в  LS
●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли
  эта  версия  в  oldVersions
●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии
●    Патчим  все  ресурсы  в  LS  и  проверяем  чексумму




  23
При  выходе  новой  версии
●    Смотрим,  что  у  пользователя  в  LS
●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли
  эта  версия  в  oldVersions
●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии

●    Патчим  все  ресурсы  в  LS  и  проверяем  чексумму
●    Если  все  ок  —  обновляем  значение  с  версией  в  LS  на  актуальную




  24
Что  получили?
Появится  в  продакшене  в  ближайшее  время,  поэтому  точных
цифр  пока  нет


Знаем,  что  средний  размер  патча  составляет  10  -­  15  Кб




25
А  что  еще  есть?
●    Shared  Dictionary  Compression  over  HTTP  (SDCH)
●    Delta  encoding  in  HTTP




  26
SDCH
●    Изобрел  Google  в  2008  году




  27
SDCH
●    Изобрел  Google  в  2008  году
●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц




  28
SDCH
●    Изобрел  Google  в  2008  году
●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц

●    Поддерживается  только  в  Chrome




  29
SDCH
●    Изобрел  Google  в  2008  году
●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц

●    Поддерживается  только  в  Chrome
●    Нет  реализации  для  популярных  веб-­серверов




  30
SDCH
●    Изобрел  Google  в  2008  году
●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц
●    Поддерживается  только  в  Chrome
●    Нет  реализации  для  популярных  веб-­серверов
●    Словарь  генерируется  медленно




  31
SDCH
   Заголовки  запроса:


01. Accept-Encoding: gzip, deflate, sdch




   32
SDCH
   Заголовки  ответа:


01. Content-type: text/html
02. Content-Encoding: gzip
03. Get-Dictionary: {путь к словарю}




   33
SDCH
      Запрос  за  словарем:


01. GET {путь к словарю} HTTP/1.1
02. Accept-Encoding: sdch, gzip
03.
04. {контент словаря}




      34
SDCH
   Следующий  запрос:


01. Accept-Encoding: gzip, deflate, sdch
02. Avail-Dictionary: TWFuIGlz




   35
SDCH
      Заголовки  ответа:


01. Content-type: text/html
02. Content-Encoding: sdch, gzip
03. ...

04.
05. JOWk0d2N...VCDIFFed {контент}



      36
Delta  encoding  in  HTTP
●    RFC3229  был  представлен  в  2002  году




  37
Delta  encoding  in  HTTP
●    RFC3229  был  представлен  в  2002  году
●    Разные  методы  diff/сжатия




  38
Delta  encoding  in  HTTP
●    RFC3229  был  представлен  в  2002  году
●    Разные  методы  diff/сжатия
●    Никем  не  поддерживается




  39
Delta  encoding  in  HTTP
   Заголовки  запроса:


01. GET /foo.css HTTP/1.1
02. If-None-Match: "123xyz"
03. A-IM: vcdiff, diffe, gzip




   40
Delta  encoding  in  HTTP
      Заголовки  ответа:


01. HTTP/1.1 226 IM Used
02. ETag: "489uhw"
03. IM: vcdiff
04.
05. {контент патча}



      41
Михаил  Корепанов

Разработчик  интерфейсов
   panyakor@yandex-­team.ru
  @panyakor
    

More Related Content

PDF
Михаил Корепанов "Инкрементальные обновления на клиенте"
PDF
All iso standards available in english and russian (translation) languages, s...
PPTX
"Великолепный API без Rest", Констатин Якушев (Badoo)
PDF
All iso standards available in english and russian (translation) languages, s...
PDF
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
PDF
Работаем с API по-взрослому - Максим Кислов (Badoo)
PDF
Rust - GDG DevFest Siberia 2016
PDF
Павел Пушкарев — «Развертывание верстки»
Михаил Корепанов "Инкрементальные обновления на клиенте"
All iso standards available in english and russian (translation) languages, s...
"Великолепный API без Rest", Констатин Якушев (Badoo)
All iso standards available in english and russian (translation) languages, s...
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Работаем с API по-взрослому - Максим Кислов (Badoo)
Rust - GDG DevFest Siberia 2016
Павел Пушкарев — «Развертывание верстки»

What's hot (16)

PDF
Стабы для фронтенда - Никита Мостовой (HeadHunter)
PDF
All Russian PB standards in English, Safety Regulations of the Russian Federa...
PDF
Оптимизация JavaScript в Drupal
PDF
Введение в язык программирования Go
PDF
All iso standards available in english and russian (translation) languages, s...
PDF
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
PDF
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
PDF
All Russian Federation NPB standards in English, RF Fire safety regulations i...
PDF
Как сделать стриминг для сервиса, который хранит миллионы видеофайлов — Лев Т...
PDF
Готовим код 
в мир открытых исходников
PPTX
ToroDB (highload++2015)
PDF
Как ВКонтакте использует Go
PPTX
Как быть с большими сайтами на Word press
PDF
BeeGo для веб приложений, API и демонов
PDF
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
PDF
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Стабы для фронтенда - Никита Мостовой (HeadHunter)
All Russian PB standards in English, Safety Regulations of the Russian Federa...
Оптимизация JavaScript в Drupal
Введение в язык программирования Go
All iso standards available in english and russian (translation) languages, s...
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
All Russian Federation NPB standards in English, RF Fire safety regulations i...
Как сделать стриминг для сервиса, который хранит миллионы видеофайлов — Лев Т...
Готовим код 
в мир открытых исходников
ToroDB (highload++2015)
Как ВКонтакте использует Go
Как быть с большими сайтами на Word press
BeeGo для веб приложений, API и демонов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Ad

Viewers also liked (9)

PDF
"How the Universe is put to the test" – Andrei Golutvin, Ulrik Egede, CERN
PDF
Кирилл Меркушев — Матчеры: польза использования и легкость применения в ваших...
PDF
Игорь Шевченко — Новая выдача Поиска для сайта - кастомные теги, CSS3 и JavaS...
PDF
Михаил Давыдов - JavaScript. Асинхронность
DOCX
Angie carolina barrera monzo
PDF
Дмитрий Вульбрун — Новая выдача Поиска для сайта
PDF
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
PDF
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
PDF
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
"How the Universe is put to the test" – Andrei Golutvin, Ulrik Egede, CERN
Кирилл Меркушев — Матчеры: польза использования и легкость применения в ваших...
Игорь Шевченко — Новая выдача Поиска для сайта - кастомные теги, CSS3 и JavaS...
Михаил Давыдов - JavaScript. Асинхронность
Angie carolina barrera monzo
Дмитрий Вульбрун — Новая выдача Поиска для сайта
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
Ad

Similar to Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никакой магии" (20)

PDF
My talk on HBase ops engineering at TBD Jun 2016
PDF
SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (Li...
PDF
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
PDF
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
PPTX
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
PDF
Алексей Андросов "Криокамера для статики"
PDF
Масштабируемая архитектура фронтенда
PDF
AVITO. Решардинг Redis без даунтайма. DevConf 2012
PDF
Советы для начинающих разработчиков PostgreSQL
PDF
Zero Downtime PHP Deployment with Envoyer And Forge
PPTX
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
PDF
Профессиональная разработка в суровом Enterprise
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
PPTX
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
PDF
20160303 Hacking PostgreSQL Тема 02 Сообщество PostgreSQL и инструменты разра...
PDF
Иван Карев — Клиентская оптимизация
PDF
Денис Паясь
ODP
My talk on LeoFS, HappyDev 2014
PDF
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
PDF
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
My talk on HBase ops engineering at TBD Jun 2016
SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (Li...
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
Алексей Андросов "Криокамера для статики"
Масштабируемая архитектура фронтенда
AVITO. Решардинг Redis без даунтайма. DevConf 2012
Советы для начинающих разработчиков PostgreSQL
Zero Downtime PHP Deployment with Envoyer And Forge
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Профессиональная разработка в суровом Enterprise
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
20160303 Hacking PostgreSQL Тема 02 Сообщество PostgreSQL и инструменты разра...
Иван Карев — Клиентская оптимизация
Денис Паясь
My talk on LeoFS, HappyDev 2014
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта

More from Yandex (20)

PDF
Предсказание оттока игроков из World of Tanks
PDF
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
PDF
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
PDF
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
PDF
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PDF
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
PDF
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
PDF
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
PDF
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
PDF
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
PDF
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
PDF
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
PDF
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
PDF
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
PDF
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
PDF
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
PDF
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Предсказание оттока игроков из World of Tanks
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...

Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никакой магии"

  • 1. Инкрементальные обновления  на  клиенте Михаил  Корепанов,  разработчик  интерфейсов Я.Субботник,  Рига,  6  апреля  2013
  • 2. Обо  мне  panyakor@yandex-­team.ru   @panyakor   ●    Разработчик  интерфейсов  в  команде  Яндекс.Почты ●    Нравится  разбираться  в  новых  технологиях, особенно  если  они  позволяют  что-­то автоматизирвать  или  ускорить ●    Можете  спрашивать  про  JS,  CSS,  клиентскую  оптимизацию 02
  • 3. Яндекс.Почта ●    Больше  1  МБ  статики 03
  • 4. Яндекс.Почта ●    Больше  1  МБ  статики ●    Обновляется  2  раза  в  неделю 04
  • 5. Яндекс.Почта ●    Больше  1  МБ  статики ●    Обновляется  2  раза  в  неделю ●    От  версии  к  версии  меняется  не  так  много  кода  (особенно  в случае  хотфиксов) 05
  • 6. Что  уже  сделано  для ускорения  загрузки? ●    gzip ●    Кэширование ●    CDN ●    Фриз  JS/CSS/картинок ●    Параллельная  загрузка  ресурсов  через  XHR 06
  • 7. Этого  не  достаточно! Даже  при  фризе  JS/CSS,  если  от  релиза  к  релизу  меняется только  пара  строк,  кэш  для  ресурса  инвалидируется  полностью. 07
  • 8. Инкрементальные  обновления От  версии  к  версии  меняется  не  так  много  кода  (около  10%,  а  в случае  хотфиксов  еще  меньше). А  что  если  при  выходе  новой  версии  передавать  только изменения? 08
  • 9. Инкрементальные  обновления Что  если  хранить  где-­то  старую  версию  (например  в  localStorage), а  при  выходе  новой  передавать  только  diff  между  новой  и  той, которая  уже  сохранена  у  пользователя? А  дальше  просто  накладывать  патч  на  клиенте. 09
  • 10. Библиотеки  diff  на  JS ●    Vcdiff  (https://github.com/plotnikoff/vcdiff.js) ●    google  diff  patch  match  (http://code.google.com/p/google-­diff-­match-­ patch/) ●    jsdiff  (https://github.com/kpdecker/jsdiff) ●    pretty  diff  (https://github.com/austincheney/Pretty-­Diff) ●    jsdifflib  (https://github.com/cemerick/jsdifflib) 10
  • 11. Библиотеки  diff  на  JS ●    Vcdiff  (https://github.com/plotnikoff/vcdiff.js) ●    google  diff  patch  match  (http://code.google.com/p/google-­diff-­match-­ patch/) ●    jsdiff  (https://github.com/kpdecker/jsdiff)  (в  5  раз  медленнее,  чем google  diff  patch  match) ●    pretty  diff  (https://github.com/austincheney/Pretty-­Diff)  (не  умеет патчить) ●    jsdifflib  (https://github.com/cemerick/jsdifflib)  (не  умеет  патчить) 11
  • 12. Размер  патча  (в  байтах) Vcdiff  (размер Vcdiff  (размер Vcdiff  (размер google  diff  patch блока  3) блока  10) блока  20) match 13957 3586 3431 9297 865 367 309 910 4615 1854 1736 6740 12
  • 13. Время  наложения  патча  на клиенте  (в  миллисекундах) IE  9 Opera  12 Firefox  19 Chrome vcdiff  (размер  блока  10) 8 5 5 3 google  diff  patch  match 1363 76 43 35 13
  • 14. Vcdiff ●    RFC3284  (2002) ●    Используется  Google  в  SDCH ●    Используется  в  "Delta  encoding  in  HTTP"  (RFC3229) Сравнивает  строки  поблочно.  Размер  блока  по  умолчанию  —  20 байт 14
  • 15. Храним  JS/CSS  на  клиенте Храним  в  localStorage. Каждый  ресурс  —  отдельный  ключ. jane.js — 6.18.7@... jane.version — 6.18.7 15
  • 16. При  сборке Генерим  патчи  для  каждого  ресурса  для  предыдущих  3-­х  версий. В  index.html  инлайн  скриптом  вставляем  список  версий,  для которых  у  нас  есть  патчи: 01. oldVersions = { 02. "jane": ["6.19.4", "6.18.7", "6.17.5"], 03. "mail": ["6.19.7", "6.18.8", "6.17.6"] 04. } 16
  • 17. Формат  файла  с  патчами 01. [ 02. { 03. "k": "jane.css", 04. "p": [patch], 05. "s": 4554 06. } 07. ] 17
  • 18. Формат  файла  с  патчами "k"  —  ключ  ресурса  в  LS. "p"  —  патч  для  ресурса,  который  сгенерировал  Vcdiff. "s"  —  чексумма  для  ресурса  актуальной  версии  по  алгоритму Флетчера. 18
  • 19. Почему  алгоритм  Флетчера? ●    Быстрый ●    Компактный ●    Легок  в  реализации 19
  • 20. При  выходе  новой  версии ●    Смотрим,  что  у  пользователя  в  LS 20
  • 21. При  выходе  новой  версии ●    Смотрим,  что  у  пользователя  в  LS ●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли эта  версия  в  oldVersions 21
  • 22. При  выходе  новой  версии ●    Смотрим,  что  у  пользователя  в  LS ●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли эта  версия  в  oldVersions ●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии 22
  • 23. При  выходе  новой  версии ●    Смотрим,  что  у  пользователя  в  LS ●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли эта  версия  в  oldVersions ●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии ●    Патчим  все  ресурсы  в  LS  и  проверяем  чексумму 23
  • 24. При  выходе  новой  версии ●    Смотрим,  что  у  пользователя  в  LS ●    Если  для  нужного  проекта  есть  версия  в  LS  —  смотрим  есть  ли эта  версия  в  oldVersions ●    Если  есть,  посылаем  запрос  за  патчем  для  этой  версии ●    Патчим  все  ресурсы  в  LS  и  проверяем  чексумму ●    Если  все  ок  —  обновляем  значение  с  версией  в  LS  на  актуальную 24
  • 25. Что  получили? Появится  в  продакшене  в  ближайшее  время,  поэтому  точных цифр  пока  нет Знаем,  что  средний  размер  патча  составляет  10  -­  15  Кб 25
  • 26. А  что  еще  есть? ●    Shared  Dictionary  Compression  over  HTTP  (SDCH) ●    Delta  encoding  in  HTTP 26
  • 27. SDCH ●    Изобрел  Google  в  2008  году 27
  • 28. SDCH ●    Изобрел  Google  в  2008  году ●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц 28
  • 29. SDCH ●    Изобрел  Google  в  2008  году ●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц ●    Поддерживается  только  в  Chrome 29
  • 30. SDCH ●    Изобрел  Google  в  2008  году ●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц ●    Поддерживается  только  в  Chrome ●    Нет  реализации  для  популярных  веб-­серверов 30
  • 31. SDCH ●    Изобрел  Google  в  2008  году ●    Хорошо  подходит  для  сжатия  часто  обновляемых  страниц ●    Поддерживается  только  в  Chrome ●    Нет  реализации  для  популярных  веб-­серверов ●    Словарь  генерируется  медленно 31
  • 32. SDCH Заголовки  запроса: 01. Accept-Encoding: gzip, deflate, sdch 32
  • 33. SDCH Заголовки  ответа: 01. Content-type: text/html 02. Content-Encoding: gzip 03. Get-Dictionary: {путь к словарю} 33
  • 34. SDCH Запрос  за  словарем: 01. GET {путь к словарю} HTTP/1.1 02. Accept-Encoding: sdch, gzip 03. 04. {контент словаря} 34
  • 35. SDCH Следующий  запрос: 01. Accept-Encoding: gzip, deflate, sdch 02. Avail-Dictionary: TWFuIGlz 35
  • 36. SDCH Заголовки  ответа: 01. Content-type: text/html 02. Content-Encoding: sdch, gzip 03. ... 04. 05. JOWk0d2N...VCDIFFed {контент} 36
  • 37. Delta  encoding  in  HTTP ●    RFC3229  был  представлен  в  2002  году 37
  • 38. Delta  encoding  in  HTTP ●    RFC3229  был  представлен  в  2002  году ●    Разные  методы  diff/сжатия 38
  • 39. Delta  encoding  in  HTTP ●    RFC3229  был  представлен  в  2002  году ●    Разные  методы  diff/сжатия ●    Никем  не  поддерживается 39
  • 40. Delta  encoding  in  HTTP Заголовки  запроса: 01. GET /foo.css HTTP/1.1 02. If-None-Match: "123xyz" 03. A-IM: vcdiff, diffe, gzip 40
  • 41. Delta  encoding  in  HTTP Заголовки  ответа: 01. HTTP/1.1 226 IM Used 02. ETag: "489uhw" 03. IM: vcdiff 04. 05. {контент патча} 41