SlideShare a Scribd company logo
JavaScript на сервере,
1ms на трансформацию
   Андрей Сумин, Mail.ru
Зачем?
Зачем?
— Пишут одни, а используют другие
Зачем?
— Пишут одни а используют другие
— JavaScript специалисты
Зачем?
— Пишут одни а используют другие
— JavaScript специалисты
— Шаблонизация на клиенте
Что нужно
XSLT JS
XSLT JS
XSLT
/head.xml
      <title><fest:get name="title"/></title>
      <fest:set name="title">Mail.ru</fest:set>
XSLT
/head.xml
      <title><fest:get name="title"/></title>
      <fest:set name="title">Mail.ru</fest:set>
/mail.xml
      <fest:include src="head.xml"/>
      <fest:set name="title">Почта</fest:set>
JavaScript
<fest:script>
       var text = "mail.ru"
</fest:script>
<fest:value>text</fest:value>
JavaScript
<fest:script>
       var text = "mail.ru"
</fest:script>
<fest:value>text</fest:value>

mail.ru
XML
XML
— IDE
XML
— IDE
— Валидация из коробки
XML
— IDE
— Валидация из коробки
— Name spaces
XML
— IDE
— Валидация из коробки
— Name spaces
— SAX, XSLT, XSD, DTD …
XML
— IDE
— Валидация из коробки
— Name spaces
— SAX, XSLT, XSD, DTD ...
— XML to XML
Реализация
Ковбойство
Структура
    vs
Функция
Структура vs функция
[   {action:"template"},
    "<html>...",
    {action:"value"},
    "json.value"]
Структура vs функция
[   {action:"template"},
    "<html>....”,
    {action:"if"},
    "json.value",
    "<span>true</span>",
    "<span>false</span>"]
Структура vs функция
function template(json){
      var html = "";
      html += "<html>…";
      html += json.value;
      return html;
}
Структура vs функция
200ms
3ms
Структура vs функция
fest:forearch   for(i = 0; i < l; i++) {}
fest:if         if(value) {}
fest:choose     if(value) {} else {}

fest:set        set[name] = function
                set[name] = function
Структура vs функция
<span>        html += "<span>";
    mail.ru   html += "mail.ru";
</span>       html += "</span>";
Структура vs функция
<span>                 html += "<span>";
    mail.ru            html += "mail.ru";
</span>                html += "</span>";

html += "<span>mail.ru</span>";
30%
Безопасность
try catch
try catch
 escape
Безопасность
<fest:value>json.name</fest:value>
try {
       html += escape(json.name);
} catch(e) {
       log(e.message);
}
Интеграция
Интеграция
—С
— Perl
— Python
— NodeJS
Интеграция
—С           fest_log
— Perl       fest_file
— Python     fest_dirname
— NodeJS
Интеграция
—С           fest_log
— Perl       fest_file
— Python     fest_dirname
— NodeJS

— Браузер
Реальные
пользователи
4ms
Реальные пользователи
msg_length = 5
msg_1_title = "letter"
msg_1_Unread = 1
Реальные пользователи
msg_length = 5
msg_1_title = "letter"
msg_1_Unread = 1

msg = [ {title: "letter", Unread: true} ]
Реальные пользователи
hash -> v8 api -> JavaScript
hash -> string -> JSON.parse -> JavaScript
hash -> string -> compile -> Javascript
Реальные пользователи
Local<String> script = String::new(
      "template("{value:'mail.ru'}")"
);
Local<Script> cs = Script::Compile( script );
Local<Value> result = cs->Run();
2 + 4 = 6ms
67%
NodeJS
NodeJS 4ms
Реальные пользователи
msg_length = 5
msg_1_title = "letter"
msg_1_Unread = 1
Реальные пользователи
msg_length = 5
msg_1_title = "letter"
msg_1_Unread = 1


get('msg_' + i + '_title')
3ms
Реальные пользователи
30 часов одно ядро 2.2 ГГц Xeon
10 000 000+ хитов
1.6ms среднее время трансформации
992 422     10% между         2 и 5ms
208 464     2% между          5 и 10ms
396 49      0,4% больше       10ms
Продакшен,
  главная
50% x3
65+100=165кб
RB lite v8 lite
Почти продакшен
html += "foo";
html += rb(id);
html += "bar";
Почти продакшен
html += "foo";    push_string("foo");
html += rb(id);   push_rb(id);
html += "bar";    push_string("bar");
50% x2
440 000 000
440 000 000
110 000 000
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Данные на сегодня
Размер HTML, который генерирует v8 65кб.

Время, работы v8 на запрос 1ms.

В среднем v8 требует 40MB на контекст.
Проблемы v8
http://sysoev.ru/prog/v8.html
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Полезные ссылки
— http://code.google.com/p/v8/
— https://github.com/mailru/fest
— http://sysoev.ru/prog/v8.html

Андрей Сумин, andrewsumin@corp.mail.ru
Возможности
    fest
fest:value
<fest:value>json.name</fest:value>
try {
       html += escape(json.name);
} catch(e) {
       log(e.message);
}
fest:value
<fest:value output="text">json.name</fest:value>
try {
       html += json.name;
} catch(e) {
       log(e.message);
}
fest:value
<fest:value safe="true">json.name</fest:value>

html += json.name;
fest:if
<fest:if test="json.condition">…</fest:if>

try{ condition = json.condition } catch(e) { log(e) }

If (condition){ … }
fest:choose
<fest:choose>
       <fest:when test="json.condition">…</fest:when>
       <fest:when test="false">…</fest:when>
       <fest:otherwise>…</fest:otherwise>
</fest:choose>
fest:choose
try{ condition = json.condition } catch(e) { log(e) }
If (condition){…}
else{
       try{ condition = false } catch(e) { log(e) }
       if (condition){}
       else {} }
fest:foreach
<fest:foreach iterate="list" index="i"></fest:foreach>
var i;
try{ foreach = list } catch(e) { foreach=[]; log(e) }
var l = list.length;
for(i = 0; i < l ; i++) { … }
fest:for
<fest:for iterate="hash" index="i"></fest:for>
var i;
try{ for = hash } catch(e) { for={}; log(e) }
for(i in for) { … }
fest:space
<fest:space/>

html += " ";
fest:script
<fest:script> … </fest:script>

try{ … } catch (e) { log(e) }
fest:insert
<script>
       <fest:insert src="script.js"/>
</script>

html += "<script>…</script>";

More Related Content

PPT
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
PPTX
PowerShell
PDF
Семь тысяч Rps, один go
PPTX
C++ для web с помощью Emscripten
PPTX
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
PPT
Perl in practice
PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PPT
Работа с большими файлами под перлом‎
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
PowerShell
Семь тысяч Rps, один go
C++ для web с помощью Emscripten
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
Perl in practice
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Работа с большими файлами под перлом‎

What's hot (20)

PDF
17 - Web-технологии. Real Time сообщения
PPTX
Everything you wanted to know about writing async, high-concurrency HTTP apps...
PDF
Wordpress Cron
PPTX
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
PDF
Компиляция скриптов PHP. Алексей Романенко
PDF
Владислав Животнев - Основы DNS
PDF
CSSO — сжимаем CSS
PDF
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
PPTX
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
PPT
Node.JS: возможности для РНР-разработчика
PPT
Eugene Lisitsky Web Sockets
PPT
Web sockets
PDF
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
PDF
Нейронные сети на JS
PDF
Thumbtack Expertise Days # 5 - Ansible
PPTX
04 web server_deployment_ru
PDF
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
17 - Web-технологии. Real Time сообщения
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Wordpress Cron
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Компиляция скриптов PHP. Алексей Романенко
Владислав Животнев - Основы DNS
CSSO — сжимаем CSS
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Node.JS: возможности для РНР-разработчика
Eugene Lisitsky Web Sockets
Web sockets
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Нейронные сети на JS
Thumbtack Expertise Days # 5 - Ansible
04 web server_deployment_ru
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Ad

Viewers also liked (8)

PDF
Rapid upgrades with pg upgrade (Bruce Momjian)
PPTX
Зачем переписывать то, что и так работает (Сергей Константинов)
PPT
Практическое применение семантического анализа для фильтрации трафика (Яков М...
PDF
Путь самурая: от скрама до канбана (Евгений Кобзев, Александр Кудымов)
PDF
The next generation of google APIs (Ade Oshineye)
PDF
Инженерный дзен. Непрерывные изменения (Александр Титов)
PDF
История одной кнопки или b-form-button.css и b-form-button.js (Елена Глухова,...
PPTX
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
Rapid upgrades with pg upgrade (Bruce Momjian)
Зачем переписывать то, что и так работает (Сергей Константинов)
Практическое применение семантического анализа для фильтрации трафика (Яков М...
Путь самурая: от скрама до канбана (Евгений Кобзев, Александр Кудымов)
The next generation of google APIs (Ade Oshineye)
Инженерный дзен. Непрерывные изменения (Александр Титов)
История одной кнопки или b-form-button.css и b-form-button.js (Елена Глухова,...
«Рамблер Касса» как пример высокопроизводительного проекта на .Net (Дмитрий П...
Ad

Similar to JavaScript на сервере, 1ms на трансформацию (Андрей Сумин) (20)

PDF
Парсим CSS: performance tips & tricks
PDF
PDF
Парсим CSS
PDF
JavaScript Базовый. Занятие 09.
PPTX
Мировые информационные ресурсы. Лекция 5
PDF
Серверный JavaScript: NodeJS и CouchDB
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
PPT
Подробная презентация JavaScript 6 в 1
PPT
Javascript
PPTX
course js day 2
PDF
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
PPT
Web осень 2012 лекция 9
PPT
Web весна 2012 лекция 9
PPT
Подробная презентация JavaScript 6 в 1
PDF
Михаил Корепанов "Инкрементальные обновления на клиенте"
PDF
Практическое применение HTML5 в Я.Почте
PPT
Эффективный AJAX
PDF
Фронтенд разработка без боли
PPT
Javascript
PDF
SPA инструменты
Парсим CSS: performance tips & tricks
Парсим CSS
JavaScript Базовый. Занятие 09.
Мировые информационные ресурсы. Лекция 5
Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Подробная презентация JavaScript 6 в 1
Javascript
course js day 2
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Web осень 2012 лекция 9
Web весна 2012 лекция 9
Подробная презентация JavaScript 6 в 1
Михаил Корепанов "Инкрементальные обновления на клиенте"
Практическое применение HTML5 в Я.Почте
Эффективный AJAX
Фронтенд разработка без боли
Javascript
SPA инструменты

More from Ontico (20)

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

JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)