SlideShare a Scribd company logo
HTML5 в Я.Почте
Алексей Андросов
Старший разработчик интерфейсов



Я.Субботник, Екатеринбург, 2 июля 2011 года
Будущее? Реальность!
2
WebSocket,
или как работает
автообновление
ящика в Я.Почте


3
Автообновление почты
Задача:
— Поддерживать ящик в актуальном
  состоянии без перезагрузки страницы
— Надо ходить за данными в другой
  домен




4
Автообновление почты
Решение:
— WebSocket (реализация в браузере или
  на Flash)
— В качестве запасного варианта iframe +
  long-polling + postMessage




5
Почему WebSocket?
— Постоянное соединение
— Честный двухсторонний обмен данными
  без лишних телодвижений
— Не учитывается в ограничениях на
  количество одновременных
  подключений, т.к. другой протокол
— Возможность кроссдоменных запросов
— Chrome 4+, Safari 5+, Firefox 6 (14%
  пользователей Я.Почты)
— Flash есть почти у всех :-)
6
Сервер
Xiva (HTTP Extended Event
Automata)
Лицензия GPL, github.com/highpower/xiva
— Специально написан, чтобы держать
  много подключений
— Занимается только доставкой push-
  уведомлений
— Каждый сервис может послать туда
  сообщение, не задумываясь о его
  доставке

7
Что передаётся?
    {
        "operation": "тип операции",
        "data": "xml-данные",
        "lcn": "номер ревизии",
        "connection_id": "id соединения"
    }

— lcn нужен, чтобы понимать, не
  пропустили ли мы сообщений,
  например, при разрыве соединения
— connection_id нужен, чтобы понимать,
  откуда произошло изменение


8
Автообновление почты
Недостатки Flash
— Плохая реализация для не-Windows OS
— После реализации WSS (аналог HTTPS)
  размер возрастает до 200кб
— Если что-то пошло не так, то Flash сразу
  падает, нельзя получить лог ошибки


— Отказываемся в пользу Cross-site XHR и
  Server-side Events

9
Автообновление почты
Недостатки WebSocket
— Протокол и API до сих пор не
  утверждены как стандарт
— В JS API нельзя получить заголовки
  ответа. Например, вместо 403 надо
  отвечать специальным сообщением
— При потере интернета не всегда
  закрывается соединение. Нужны ping-
  pong события для проверки соединения



10
Автообновление почты
FAIL WebSocket
— В ноябре 2010 года были опубликованы
  исследования протокола. Из-за багов в
  реализации прозрачных прокси-
  серверов с помощью протокола можно
  подменять кэш сервера
— По-умолчанию выключен в Firefox и
  Opera, блокируется некоторыми
  антивирусами
— В апреле вышла новая спецификация,
  Mozilla она устроила (релиз Firefox 6 в
  конце лета)
11
Что получилось?
— Простая реализация поддержки ящика
  в актуальном состоянии на
  современных клиентских технологиях
— Постоянное соединение с сервером, а
  значит — минимальные задержки в
  доставке




12
Cross-site XHR +
 localStorage,
 или как грузится
 Я.Почта


13
Кэширование статики
Проблема
— Для инициализации надо загрузить 1Мб
  (gzip - 350кб) статики (css+js+xsl)
— Браузерное кэширование работает, но
  возникают задержи, т. к. браузер
  пытается понять, надо ли обновить
  файл
— Браузерный кэш может вытесниться
  другими файлами



14
Кэширование статики
Решение
— Выносим логику инвалидации кэша на
  сторону JavaScript
— Для этого нужны кроссдоменный XHR,
  чтобы получить содержимое файлов, и
  localStorage, чтобы их хранить




15
Кэширование статики
Получаем
— Данные из localStorage не удалятся,
  пока мы этого не захотим или
  пользователь их не очистит
— Нет задержек при обращении к кэшу
— Разгружаем статический кластер




16
localStorage
— Локальное постоянное key-value
  хранилище текстовых данных
— Chrome 4+, Firefox 3.5+, IE8+, Opera
  10.5+, Safari 4+.
— 88% пользователей Я.Почты




17
Что хранить в localStorage?
— Версию формата (вдруг захотим
  поменять)
— Версию проектов (при выкладке новой
  версии полностью удаляем все данные)
— Каждый запрошенный файл — в
  отдельном ключе




18
Что хранить в localStorage?
 <moduleName>+
 <guardName_1>=<guardValue_1>
 …
 <guardName_N>=<guardValue_N>

— moduleName — унифицированное имя
  файла
— guard — это локаль, тема или версия
 mail.mailbox_jane.js+mail-version=3.3.11-2+locale=ru

Такая схема позволяет удалять ненужные
ключи при смене языка или темы

19
localStorage
Главное правило




20
localStorage
Главное правило

   Все обращения к
 методам и свойствам
 надо оборачивать в
       try-catch!


21
localStorage
Ограничения на домен
 A mostly arbitrary limit of five megabytes
per origin is recommended.
     dev.w3.org/html5/webstorage/#disk-space


     Все браузеры следуют этой
         рекомендации, но…



22
localStorage
Ограничения на домен
— Chrome, Safari используют SQLite и UTF-
  16, поэтому записать можно ~2,5 млн.
  символов
— Fx, — SQLite + UTF-8, ~5 млн. символов
— IE — xml, ~5 млн. символов
— Opera — xml + base64, ~2 млн.
  символов, появляется сообщение с
  просьбой увеличить размер


23
localStorage
Глобальные ограничения
 User agents should guard against sites
storing data under the origins other affiliated
sites, e.g. storing up to the limit in
a1.example.com, a2.example.com, etc,
circumventing the main example.com storage
limit.
     dev.w3.org/html5/webstorage/#disk-space
— Chrome, Safari — нет
— Fx, IE ~5 млн. символов на домен 2-го
  уровня
— Opera — ~35 млн. символов на всё
24
Cross-site XHR with CORS
— Обычный XMLHttpRequest, но с
  возможностью делать запросы в другой
  домен
— В ответе сервера должен появиться
  HTTP-заголовок
     «Access-Control-Allow-Origin: *»
— Chrome 3+, Firefox 3.5+, IE8+
  (XDomainRequest), Safari 4+
— Opera — нет!
— 70% пользователей Я.Почты

25
Cross-site XHR with CORS
Проблемы
— Не все прокси-сервера пропускают
  заголовки Access-Control-Allow-Origin
 xdr['onerror'] = function(){
    // fallback до обычный системы загрузки
 }


— XDomainRequest не является заменой
  XHR, имеет ограниченный функционал
— В IE9 в режиме IE9 виснут запросы
 xdr['onprogress'] = function() {};


26
Что получилось?
Время загрузки
            Кэш (мс)   localStorage (мс)
Chrome 11   3036       3004
Firefox 4   1873       1544
IE 8        4243       3454
Safari 5    4294       2699




27
Вопросы?




28
Алексей Андросов
Старший разработчик
интерфейсов

aandrosov@yandex-team.ru

More Related Content

PDF
Aleksey Androsov
PPTX
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
PPTX
KazHackStan 2017 | Tracking
PPTX
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
PPTX
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
PPTX
Браузерные API обмена данными: какие и зачем
PDF
HTTP протокол
PDF
Практическое применение HTML5 в Я.Почте
Aleksey Androsov
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
KazHackStan 2017 | Tracking
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Браузерные API обмена данными: какие и зачем
HTTP протокол
Практическое применение HTML5 в Я.Почте

What's hot (20)

PPTX
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
PDF
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
PDF
World of Tanks: Linux and Open Source Inside
PDF
PDF
Доставка данных в реальном времени.
PPT
Web sockets
PPT
Eugene Lisitsky Web Sockets
PPT
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
PDF
WebSockets
PDF
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
PDF
05 - Web-технологии. Сетевые протоколы
PPTX
PostgreSQL. Стильно. Модно. Молодёжно
PDF
Михаил Давыдов: Транспорт, ajax
PDF
Михаил Давыдов — Транспорт, Ajax
PPTX
High Availability в жизни обычного разработчика
PDF
Консольные приложения на Go
PPT
А.Горбов, А.Фефелов. Секреты АБАК-ПРЕСС
PPT
Работа с большими файлами под перлом‎
PPT
Eugene Lisitsky Web Sockets
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
World of Tanks: Linux and Open Source Inside
Доставка данных в реальном времени.
Web sockets
Eugene Lisitsky Web Sockets
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
WebSockets
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
05 - Web-технологии. Сетевые протоколы
PostgreSQL. Стильно. Модно. Молодёжно
Михаил Давыдов: Транспорт, ajax
Михаил Давыдов — Транспорт, Ajax
High Availability в жизни обычного разработчика
Консольные приложения на Go
А.Горбов, А.Фефелов. Секреты АБАК-ПРЕСС
Работа с большими файлами под перлом‎
Eugene Lisitsky Web Sockets
Ad

Viewers also liked (16)

PDF
Вадим Пацев "Adobe Fireworks как инструмент для проектирования интерфейсов"
PDF
Александр Лившиц "Как работают хорошие сниппеты"
PDF
Максим Ширшин "SVARX, или Борьба с большими формами"
PDF
Юрий Василевский «Автоматизация в XCode»
PDF
Артём Кошелев "Чего не хватает в PageObject?"
PDF
Вера Лейзерович, Влад Мокеев "Виджеты для главной страницы Яндекса. Что такое...
PDF
Антон Попов "Анализ эффективности сайтов: Яндекс.Метрика"
PDF
Александр Садовский "Как получить больше трафика"
PDF
Владимир Батыгин "Автоматический сбор данных по примерам"
PDF
Анастасия Ларкина "Дизайнер в поиске"
PDF
Антон Волнухин и Роман Иванов "Как устроен Поиск по блогам"
PDF
Антон Волнухин "Белорусская блогосфера"
PDF
Антон Тюрин "Распределённая система near-realtime агрегации больших объёмов д...
PDF
Сергей Пузанков — XSLT
PDF
Алексей Байтин, Алексей Осипенко "Проверка правописания в веб-приложениях"
PDF
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Вадим Пацев "Adobe Fireworks как инструмент для проектирования интерфейсов"
Александр Лившиц "Как работают хорошие сниппеты"
Максим Ширшин "SVARX, или Борьба с большими формами"
Юрий Василевский «Автоматизация в XCode»
Артём Кошелев "Чего не хватает в PageObject?"
Вера Лейзерович, Влад Мокеев "Виджеты для главной страницы Яндекса. Что такое...
Антон Попов "Анализ эффективности сайтов: Яндекс.Метрика"
Александр Садовский "Как получить больше трафика"
Владимир Батыгин "Автоматический сбор данных по примерам"
Анастасия Ларкина "Дизайнер в поиске"
Антон Волнухин и Роман Иванов "Как устроен Поиск по блогам"
Антон Волнухин "Белорусская блогосфера"
Антон Тюрин "Распределённая система near-realtime агрегации больших объёмов д...
Сергей Пузанков — XSLT
Алексей Байтин, Алексей Осипенко "Проверка правописания в веб-приложениях"
Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"
Ad

Similar to Алексей Андросов "HTML5 в Я.Почте" (20)

PDF
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
PPT
Web весна 2013 лекция 3
PDF
Ajax and Transports (in russian)
PPT
Web осень 2012 лекция 3
PPT
Web весна 2012 лекция 3
PDF
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
PDF
Mihail davidov js-ajax
PDF
Web осень 2013 лекция 3
ODP
Nginx Igor Sysoev
PDF
Phalcon - самый быстрый PHP Framework
PPT
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
PDF
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
PPT
Catalyst – MVC framework на Perl (RIT 2008)
PPT
Internet Explorer 8
PPTX
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
PPTX
Hosting for forbes.ru_
PDF
Вячеслав Бирюков - HTTP и HTTPS
PPTX
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
PDF
Другая виртуализация
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
Web весна 2013 лекция 3
Ajax and Transports (in russian)
Web осень 2012 лекция 3
Web весна 2012 лекция 3
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Mihail davidov js-ajax
Web осень 2013 лекция 3
Nginx Igor Sysoev
Phalcon - самый быстрый PHP Framework
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Catalyst – MVC framework на Perl (RIT 2008)
Internet Explorer 8
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Hosting for forbes.ru_
Вячеслав Бирюков - HTTP и HTTPS
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Другая виртуализация

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айт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...

Алексей Андросов "HTML5 в Я.Почте"

  • 1. HTML5 в Я.Почте Алексей Андросов Старший разработчик интерфейсов Я.Субботник, Екатеринбург, 2 июля 2011 года
  • 4. Автообновление почты Задача: — Поддерживать ящик в актуальном состоянии без перезагрузки страницы — Надо ходить за данными в другой домен 4
  • 5. Автообновление почты Решение: — WebSocket (реализация в браузере или на Flash) — В качестве запасного варианта iframe + long-polling + postMessage 5
  • 6. Почему WebSocket? — Постоянное соединение — Честный двухсторонний обмен данными без лишних телодвижений — Не учитывается в ограничениях на количество одновременных подключений, т.к. другой протокол — Возможность кроссдоменных запросов — Chrome 4+, Safari 5+, Firefox 6 (14% пользователей Я.Почты) — Flash есть почти у всех :-) 6
  • 7. Сервер Xiva (HTTP Extended Event Automata) Лицензия GPL, github.com/highpower/xiva — Специально написан, чтобы держать много подключений — Занимается только доставкой push- уведомлений — Каждый сервис может послать туда сообщение, не задумываясь о его доставке 7
  • 8. Что передаётся? { "operation": "тип операции", "data": "xml-данные", "lcn": "номер ревизии", "connection_id": "id соединения" } — lcn нужен, чтобы понимать, не пропустили ли мы сообщений, например, при разрыве соединения — connection_id нужен, чтобы понимать, откуда произошло изменение 8
  • 9. Автообновление почты Недостатки Flash — Плохая реализация для не-Windows OS — После реализации WSS (аналог HTTPS) размер возрастает до 200кб — Если что-то пошло не так, то Flash сразу падает, нельзя получить лог ошибки — Отказываемся в пользу Cross-site XHR и Server-side Events 9
  • 10. Автообновление почты Недостатки WebSocket — Протокол и API до сих пор не утверждены как стандарт — В JS API нельзя получить заголовки ответа. Например, вместо 403 надо отвечать специальным сообщением — При потере интернета не всегда закрывается соединение. Нужны ping- pong события для проверки соединения 10
  • 11. Автообновление почты FAIL WebSocket — В ноябре 2010 года были опубликованы исследования протокола. Из-за багов в реализации прозрачных прокси- серверов с помощью протокола можно подменять кэш сервера — По-умолчанию выключен в Firefox и Opera, блокируется некоторыми антивирусами — В апреле вышла новая спецификация, Mozilla она устроила (релиз Firefox 6 в конце лета) 11
  • 12. Что получилось? — Простая реализация поддержки ящика в актуальном состоянии на современных клиентских технологиях — Постоянное соединение с сервером, а значит — минимальные задержки в доставке 12
  • 13. Cross-site XHR + localStorage, или как грузится Я.Почта 13
  • 14. Кэширование статики Проблема — Для инициализации надо загрузить 1Мб (gzip - 350кб) статики (css+js+xsl) — Браузерное кэширование работает, но возникают задержи, т. к. браузер пытается понять, надо ли обновить файл — Браузерный кэш может вытесниться другими файлами 14
  • 15. Кэширование статики Решение — Выносим логику инвалидации кэша на сторону JavaScript — Для этого нужны кроссдоменный XHR, чтобы получить содержимое файлов, и localStorage, чтобы их хранить 15
  • 16. Кэширование статики Получаем — Данные из localStorage не удалятся, пока мы этого не захотим или пользователь их не очистит — Нет задержек при обращении к кэшу — Разгружаем статический кластер 16
  • 17. localStorage — Локальное постоянное key-value хранилище текстовых данных — Chrome 4+, Firefox 3.5+, IE8+, Opera 10.5+, Safari 4+. — 88% пользователей Я.Почты 17
  • 18. Что хранить в localStorage? — Версию формата (вдруг захотим поменять) — Версию проектов (при выкладке новой версии полностью удаляем все данные) — Каждый запрошенный файл — в отдельном ключе 18
  • 19. Что хранить в localStorage? <moduleName>+ <guardName_1>=<guardValue_1> … <guardName_N>=<guardValue_N> — moduleName — унифицированное имя файла — guard — это локаль, тема или версия mail.mailbox_jane.js+mail-version=3.3.11-2+locale=ru Такая схема позволяет удалять ненужные ключи при смене языка или темы 19
  • 21. localStorage Главное правило Все обращения к методам и свойствам надо оборачивать в try-catch! 21
  • 22. localStorage Ограничения на домен A mostly arbitrary limit of five megabytes per origin is recommended. dev.w3.org/html5/webstorage/#disk-space Все браузеры следуют этой рекомендации, но… 22
  • 23. localStorage Ограничения на домен — Chrome, Safari используют SQLite и UTF- 16, поэтому записать можно ~2,5 млн. символов — Fx, — SQLite + UTF-8, ~5 млн. символов — IE — xml, ~5 млн. символов — Opera — xml + base64, ~2 млн. символов, появляется сообщение с просьбой увеличить размер 23
  • 24. localStorage Глобальные ограничения User agents should guard against sites storing data under the origins other affiliated sites, e.g. storing up to the limit in a1.example.com, a2.example.com, etc, circumventing the main example.com storage limit. dev.w3.org/html5/webstorage/#disk-space — Chrome, Safari — нет — Fx, IE ~5 млн. символов на домен 2-го уровня — Opera — ~35 млн. символов на всё 24
  • 25. Cross-site XHR with CORS — Обычный XMLHttpRequest, но с возможностью делать запросы в другой домен — В ответе сервера должен появиться HTTP-заголовок «Access-Control-Allow-Origin: *» — Chrome 3+, Firefox 3.5+, IE8+ (XDomainRequest), Safari 4+ — Opera — нет! — 70% пользователей Я.Почты 25
  • 26. Cross-site XHR with CORS Проблемы — Не все прокси-сервера пропускают заголовки Access-Control-Allow-Origin xdr['onerror'] = function(){ // fallback до обычный системы загрузки } — XDomainRequest не является заменой XHR, имеет ограниченный функционал — В IE9 в режиме IE9 виснут запросы xdr['onprogress'] = function() {}; 26
  • 27. Что получилось? Время загрузки Кэш (мс) localStorage (мс) Chrome 11 3036 3004 Firefox 4 1873 1544 IE 8 4243 3454 Safari 5 4294 2699 27