SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Редактор Mail.Ru 
или скорочтение за 
полчаса 
Павел Зиновкин
Редактор Mail.Ru? 
• Beta-тестирование с сентября, Почта и Облако 
• xlsx и pptx – MS Office Web App 
• doc/docx – сделали сами!
Не только редактор! 
Свое функциональное ядро. Оно дает: 
• Просмотр документов: doc, docx, xls, xlsx, ppt, pptx, rtf 
• Построение для них thumbnail’ов 
• Онлайн редактирование doc и docx документов
Как все начиналось 
Почта использовала просмотр документов от MS. 
• Он медленный 
• Нестабильный 
• Black box 
А что если сделать свой просмотрщик?
Как читаем документы? 
Решаем читать документы сами, не через OpenOffice! 
• OO тяжелый, java 
• Тяжело прогнозировать масштабируемость 
• Невозможно прогнозировать гибкость решения
Читаем сами 
Минусы 
• Бинарные форматы 
• Объем работ для чтения 
Плюсы 
• 350 MB документации по MS форматам 
• X–форматы от MS это xml в zip-архиве 
• Гибкость лимитирована только нашим упорством
Учимся читая 
• Документация описывает структуры 
• Телепатия помогает понять логику их взаимодействия 
• 2 месяца чтобы сносно читать Word файлы: docx и doc 
• 1 год чтобы хорошо читать все три типа документов 
• до сих пор находим что-то новое
Велосипед? 
Да. И именной такой как нам надо. 
• Высокая скорость чтения: в среднем < 1 секунды 
• Вычитываем те данные которые нам нужны 
• Легко вносить изменения 
• Низкий процент ошибок при чтении: ~ 0.7% 
Но вначале все было совсем не так хорошо.
Просмотрщик изнутри 
• Backend получает запрос, планирует чтение и отдает html 
• Файл асинхронно скачивается и читается в очереди заданий 
• Client периодически опрашивает сервер о готовности документа 
• Client рендерит документ из json
Запуск просмотра 
• Все прогнозы были не верны. Кроме одного - насчет прогнозов. 
• Не беда – пользователи этого просто не видели 
• На запуске довольно много ошибок чтения документов 
• Надо больше разных файлов для исправления! 
• Читаем пока неудовлетворительно 
Как быть?
Главное – не попадаться 
Надо строить превью документов (thumbnail’ы) 
• Не сломает то что уже работало 
• Очень большое количество запросов 
• Легко сделать используя js просмотра и phantomjs 
• Server-side JS
Как сделаны превью 
• Backend скачивает, читает и рендерит документ через PhantomJS 
• PhantomJS вызывается через командную строку (subprocess) 
• Читается только первая страница документа
Едем в бой 
• Приложение не оптимально, и это ок 
• Не пытаемся прогнозировать нагрузку 
• Оптимизируем по реальным данным 
• Даем трафик и чиним то что не выдерживает
Что не покажет профайлер? 
• Все что вы не профилируете! 
• Невозможно профилировать весь стек приложения 
• Помогут графики/таймеры на разных уровнях
Оптимизируем 
• Эмбедим js и css, прекомпилируем django-шаблон 
• Передаем отрендеренный шаблон на stdin 
• Выключаем индентацию json-данных - 7% (!) ускорения рендеринга 
• Inline base64 изображения 
• Выдаем данные в bmp вместо jpeg - все равно масштабировать 
• Теперь можно профилировать
SOA can kill you 
• Сервис-провайдер может легко вас положить 
• Как и вы его 
• Таймауты на все внешние запросы 
• Графики на все 
• Помните – это симбиоз, а не паразитирование!
Превью сейчас 
• Один код для чтения документов и превью! 
• Время построения превью в диапазоне 480-800 ms 
• 30 серверов, более 700 запросов в секунду 
• Позволяют отловить ошибки логики JS 
• Но не ошибки работы с конкретным браузером 
• Часть превью строится через NodeJS
Редактирование 
Логично, но: 
• Качество html рендеринга не лучшее 
• Нужна нормальная печать документов 
• Формат, в который читаем, не удобен 
• Сможем сохранять только в docx 
• Не храним данные. Документ сохраняется в Облако.
Рендеринг 
• Html -> Canvas или SVG. Выбираем Canvas 
• Высокая точность рендеринга 
• Форма обратной связи делает скриншот того что видит пользователь 
• Некоторые проблемы с браузерами
Печать документов 
• HTML не передает всех деталей 
• Добавляет хедеры/футеры 
• Canvas позволяет генерировать pdf на сервере 
• Для показа диалога печати встраиваем JS в pdf 
• Иногда может не работать
Протокол 
• Древовидные JSON-структуры это плохо 
• Нужно уметь передавать документ по частям 
• Нужно обращаться по индексам 
• Строка + элементы на ней 
• Приходится менять логику чтения и показа – дублируем код!
Редактирование сейчас 
• Beta 
• Более 200 человек онлайн 
• Ведется интенсивная разработка
О качестве 
• Простота кода 
• Документация 
• Надежность, точность и гибкость инструментов
Тесты 
• Unit-тесты, в том числе и для js 
• Сложно писать тесты для форматов. Используем регрессии 
• Resave: json1 -> document -> json2, json1 == json2 ? 
• Делаем скриншоты между ветками и сравниваем их
Инструменты 
• Sentry и graphite/statsd для графиков из приложений 
• Diamond для графиков с серверов 
• Jenkins: тесты на каждый комит, регрессии 
• Phabricator для код-ревью
Вопросы? 
Павел Зиновкин 
Руководитель группы разработки, Почта@Mail.Ru 
p.zinovkin@corp.mail.ru

Weitere ähnliche Inhalte

Was ist angesagt?

Отполифиль свой CSS - MinskCSS 2
Отполифиль свой CSS - MinskCSS 2Отполифиль свой CSS - MinskCSS 2
Отполифиль свой CSS - MinskCSS 2Vasiliy Vanchuck
 
Mobile Web Apps development essentials
Mobile Web Apps development essentialsMobile Web Apps development essentials
Mobile Web Apps development essentialsPavlo Iuriichuk
 
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js" JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js" GeeksLab Odessa
 
Построение внутренней ссылочной структуры
Построение внутренней ссылочной структуры Построение внутренней ссылочной структуры
Построение внутренней ссылочной структуры Alexey Kostin
 
Управление требованиями в Devprom ALM 3.2
Управление требованиями в Devprom ALM 3.2Управление требованиями в Devprom ALM 3.2
Управление требованиями в Devprom ALM 3.2Dmitry Lobasev
 
Методология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, ОтношенияМетодология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, ОтношенияBadoo Development
 
Как оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых системКак оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых системСергей Кокшаров
 
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...Badoo Development
 
Павел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыПавел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыUA Mobile
 
Как оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницКак оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницСергей Кокшаров
 
Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Sergey Xek
 
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в версткеWebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в версткеWebCamp
 
«Хайлоад в рассылке почты: как спать спокойно»
«Хайлоад в рассылке почты: как спать спокойно»«Хайлоад в рассылке почты: как спать спокойно»
«Хайлоад в рассылке почты: как спать спокойно»Nata_Churda
 
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Badoo Development
 

Was ist angesagt? (16)

Mobile web apps
Mobile web appsMobile web apps
Mobile web apps
 
Отполифиль свой CSS - MinskCSS 2
Отполифиль свой CSS - MinskCSS 2Отполифиль свой CSS - MinskCSS 2
Отполифиль свой CSS - MinskCSS 2
 
Mobile Web Apps development essentials
Mobile Web Apps development essentialsMobile Web Apps development essentials
Mobile Web Apps development essentials
 
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js" JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
 
Построение внутренней ссылочной структуры
Построение внутренней ссылочной структуры Построение внутренней ссылочной структуры
Построение внутренней ссылочной структуры
 
Управление требованиями в Devprom ALM 3.2
Управление требованиями в Devprom ALM 3.2Управление требованиями в Devprom ALM 3.2
Управление требованиями в Devprom ALM 3.2
 
Методология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, ОтношенияМетодология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, Отношения
 
Drupal and NodeJS.
Drupal and NodeJS.Drupal and NodeJS.
Drupal and NodeJS.
 
Как оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых системКак оптимизировать текст для поисковых систем
Как оптимизировать текст для поисковых систем
 
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...
Доклад Юрия Насретдинова на MoscowJS Meetup. "Как мы начали работать со стати...
 
Павел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыПавел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузеры
 
Как оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страницКак оптимизировать релевантность посадочных страниц
Как оптимизировать релевантность посадочных страниц
 
Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»
 
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в версткеWebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
 
«Хайлоад в рассылке почты: как спать спокойно»
«Хайлоад в рассылке почты: как спать спокойно»«Хайлоад в рассылке почты: как спать спокойно»
«Хайлоад в рассылке почты: как спать спокойно»
 
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
 

Ähnlich wie Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)

Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Egor Konovalov
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.IT-Доминанта
 
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван Москалёв
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван  МоскалёвПереводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван  Москалёв
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван МоскалёвYandex
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
Введение во фронтенд-разработку
Введение во фронтенд-разработкуВведение во фронтенд-разработку
Введение во фронтенд-разработкуDenis Latushkin
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Fwdays
 
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)Zabbix
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработкиIT-Доминанта
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)Ontico
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнSergey Xek
 
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)Ontico
 
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFSHappyDev
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014Alex Chistyakov
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнSergey Xek
 
SharePoint и OpenXML
SharePoint и OpenXMLSharePoint и OpenXML
SharePoint и OpenXMLVitaly Baum
 

Ähnlich wie Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru) (20)

Sivko
SivkoSivko
Sivko
 
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван Москалёв
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван  МоскалёвПереводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван  Москалёв
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван Москалёв
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Введение во фронтенд-разработку
Введение во фронтенд-разработкуВведение во фронтенд-разработку
Введение во фронтенд-разработку
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
 
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)
Zabbix: Прошлое, настоящее и будущее (Zabbix: Past, present and the future)
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)
Разработка Rich Text Editor: проблемы и решения / Егор Яковишен (Setka)
 
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
2014.12.06 03 Александр Чистяков — Устройство object storage на примере LeoFS
 
My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014My talk on LeoFS, HappyDev 2014
My talk on LeoFS, HappyDev 2014
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
SharePoint и OpenXML
SharePoint и OpenXMLSharePoint и OpenXML
SharePoint и OpenXML
 

Mehr von Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

Mehr von Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)

  • 1. Редактор Mail.Ru или скорочтение за полчаса Павел Зиновкин
  • 2. Редактор Mail.Ru? • Beta-тестирование с сентября, Почта и Облако • xlsx и pptx – MS Office Web App • doc/docx – сделали сами!
  • 3.
  • 4.
  • 5. Не только редактор! Свое функциональное ядро. Оно дает: • Просмотр документов: doc, docx, xls, xlsx, ppt, pptx, rtf • Построение для них thumbnail’ов • Онлайн редактирование doc и docx документов
  • 6. Как все начиналось Почта использовала просмотр документов от MS. • Он медленный • Нестабильный • Black box А что если сделать свой просмотрщик?
  • 7. Как читаем документы? Решаем читать документы сами, не через OpenOffice! • OO тяжелый, java • Тяжело прогнозировать масштабируемость • Невозможно прогнозировать гибкость решения
  • 8. Читаем сами Минусы • Бинарные форматы • Объем работ для чтения Плюсы • 350 MB документации по MS форматам • X–форматы от MS это xml в zip-архиве • Гибкость лимитирована только нашим упорством
  • 9. Учимся читая • Документация описывает структуры • Телепатия помогает понять логику их взаимодействия • 2 месяца чтобы сносно читать Word файлы: docx и doc • 1 год чтобы хорошо читать все три типа документов • до сих пор находим что-то новое
  • 10. Велосипед? Да. И именной такой как нам надо. • Высокая скорость чтения: в среднем < 1 секунды • Вычитываем те данные которые нам нужны • Легко вносить изменения • Низкий процент ошибок при чтении: ~ 0.7% Но вначале все было совсем не так хорошо.
  • 11. Просмотрщик изнутри • Backend получает запрос, планирует чтение и отдает html • Файл асинхронно скачивается и читается в очереди заданий • Client периодически опрашивает сервер о готовности документа • Client рендерит документ из json
  • 12. Запуск просмотра • Все прогнозы были не верны. Кроме одного - насчет прогнозов. • Не беда – пользователи этого просто не видели • На запуске довольно много ошибок чтения документов • Надо больше разных файлов для исправления! • Читаем пока неудовлетворительно Как быть?
  • 13. Главное – не попадаться Надо строить превью документов (thumbnail’ы) • Не сломает то что уже работало • Очень большое количество запросов • Легко сделать используя js просмотра и phantomjs • Server-side JS
  • 14.
  • 15. Как сделаны превью • Backend скачивает, читает и рендерит документ через PhantomJS • PhantomJS вызывается через командную строку (subprocess) • Читается только первая страница документа
  • 16. Едем в бой • Приложение не оптимально, и это ок • Не пытаемся прогнозировать нагрузку • Оптимизируем по реальным данным • Даем трафик и чиним то что не выдерживает
  • 17. Что не покажет профайлер? • Все что вы не профилируете! • Невозможно профилировать весь стек приложения • Помогут графики/таймеры на разных уровнях
  • 18. Оптимизируем • Эмбедим js и css, прекомпилируем django-шаблон • Передаем отрендеренный шаблон на stdin • Выключаем индентацию json-данных - 7% (!) ускорения рендеринга • Inline base64 изображения • Выдаем данные в bmp вместо jpeg - все равно масштабировать • Теперь можно профилировать
  • 19. SOA can kill you • Сервис-провайдер может легко вас положить • Как и вы его • Таймауты на все внешние запросы • Графики на все • Помните – это симбиоз, а не паразитирование!
  • 20. Превью сейчас • Один код для чтения документов и превью! • Время построения превью в диапазоне 480-800 ms • 30 серверов, более 700 запросов в секунду • Позволяют отловить ошибки логики JS • Но не ошибки работы с конкретным браузером • Часть превью строится через NodeJS
  • 21. Редактирование Логично, но: • Качество html рендеринга не лучшее • Нужна нормальная печать документов • Формат, в который читаем, не удобен • Сможем сохранять только в docx • Не храним данные. Документ сохраняется в Облако.
  • 22. Рендеринг • Html -> Canvas или SVG. Выбираем Canvas • Высокая точность рендеринга • Форма обратной связи делает скриншот того что видит пользователь • Некоторые проблемы с браузерами
  • 23. Печать документов • HTML не передает всех деталей • Добавляет хедеры/футеры • Canvas позволяет генерировать pdf на сервере • Для показа диалога печати встраиваем JS в pdf • Иногда может не работать
  • 24. Протокол • Древовидные JSON-структуры это плохо • Нужно уметь передавать документ по частям • Нужно обращаться по индексам • Строка + элементы на ней • Приходится менять логику чтения и показа – дублируем код!
  • 25. Редактирование сейчас • Beta • Более 200 человек онлайн • Ведется интенсивная разработка
  • 26. О качестве • Простота кода • Документация • Надежность, точность и гибкость инструментов
  • 27. Тесты • Unit-тесты, в том числе и для js • Сложно писать тесты для форматов. Используем регрессии • Resave: json1 -> document -> json2, json1 == json2 ? • Делаем скриншоты между ветками и сравниваем их
  • 28. Инструменты • Sentry и graphite/statsd для графиков из приложений • Diamond для графиков с серверов • Jenkins: тесты на каждый комит, регрессии • Phabricator для код-ревью
  • 29. Вопросы? Павел Зиновкин Руководитель группы разработки, Почта@Mail.Ru p.zinovkin@corp.mail.ru