Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

81
JavaScript на сервере, 1ms на трансформацию Андрей Сумин, Mail.ru

description

Выступление Андрея Сумина, Руководителя разработки фронт-энда, Mail.Ru Group: "JavaScript на сервере, 1ms на трансформацию" на #HPC 9 августа, 2012.

Transcript of Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Page 1: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

JavaScript на сервере,1ms на трансформацию

Андрей Сумин, Mail.ru

Page 2: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Зачем?

Page 3: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Зачем?

— Пишут одни, а используют другие

Page 4: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Зачем?

— Пишут одни, а используют другие— JavaScript специалисты

Page 5: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Зачем?

— Пишут одни, а используют другие— JavaScript специалисты— Шаблонизация на клиенте

Page 6: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Что нужно

Page 7: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XSLT JS

Page 8: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XSLT JS

Page 9: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XSLT

/head.xml<title><fest:get name="title"/></title><fest:set name="title">Mail.ru</fest:set>

Page 10: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

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>

Page 11: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

JavaScript

<fest:script>var text = "mail.ru"

</fest:script><fest:value>text</fest:value>

Page 12: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

JavaScript

<fest:script>var text = "mail.ru"

</fest:script><fest:value>text</fest:value>

mail.ru

Page 13: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

Page 14: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

— IDE

Page 15: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

— IDE— Валидация из коробки

Page 16: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

— IDE— Валидация из коробки— Name spaces

Page 17: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

— IDE— Валидация из коробки— Name spaces— SAX, XSLT, XSD, DTD …

Page 18: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

XML

— IDE— Валидация из коробки— Name spaces— SAX, XSLT, XSD, DTD ...— XML to XML

Page 19: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реализация

Page 20: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Ковбойство

Page 21: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структураvs

Функция

Page 22: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

[ {action:"template"},"<html>...",{action:"value"},"json.value"]

Page 23: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

[ {action:"template"},"<html>....”,{action:"if"},"json.value","<span>true</span>","<span>false</span>"]

Page 24: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

function template(json){var html = "";html += "<html>…";html += json.value;return html;

}

Page 25: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

Page 26: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

200ms

Page 27: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

3ms

Page 28: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

fest:forearch for(i = 0; i < l; i++) {}fest:if if(value) {}fest:choose if(value) {} else {}

fest:set set[name] = functionset[name] = function

Page 29: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

<span> html += "<span>"; mail.ru html += "mail.ru";</span> html += "</span>";

Page 30: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Структура vs функция

<span> html += "<span>"; mail.ru html += "mail.ru";</span> html += "</span>";

html += "<span>mail.ru</span>";

Page 31: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

30%

Page 32: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Безопасность

Page 33: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

try catch

Page 34: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

try catchescape

Page 35: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Безопасность

<fest:value>json.name</fest:value>try {

html += escape(json.name);} catch(e) {

log(e.message);}

Page 36: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Интеграция

Page 37: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Интеграция

— С— Perl— Python— NodeJS

Page 38: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Интеграция

— С fest_log— Perl fest_file— Python fest_dirname— NodeJS

Page 39: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Интеграция

— С fest_log— Perl fest_file— Python fest_dirname— NodeJS

— Браузер

Page 40: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

Page 41: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

4ms

Page 42: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

msg_length = 5msg_1_title = "letter"msg_1_Unread = 1

Page 43: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

msg_length = 5msg_1_title = "letter"msg_1_Unread = 1

msg = [ {title: "letter", Unread: true} ]

Page 44: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

hash -> v8 api -> JavaScripthash -> string -> JSON.parse -> JavaScripthash -> string -> compile -> Javascript

Page 45: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

Local<String> script = String::new("template(\"{value:'mail.ru'}\")"

);Local<Script> cs = Script::Compile( script );Local<Value> result = cs->Run();

Page 46: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

2 + 4 = 6ms

Page 47: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

67%

Page 48: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

NodeJS

Page 49: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

NodeJS 4ms

Page 50: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

msg_length = 5msg_1_title = "letter"msg_1_Unread = 1

Page 51: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

msg_length = 5msg_1_title = "letter"msg_1_Unread = 1

get('msg_' + i + '_title')

Page 52: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

3ms

Page 53: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Реальные пользователи

30 часов одно ядро 2.2 ГГц Xeon10 000 000+ хитов1.6ms среднее время трансформации992 422 10% между 2 и 5ms208 464 2% между 5 и 10ms396 49 0,4% больше 10ms

Page 54: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Продакшен, главная

Page 55: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

50% x3

Page 56: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

65+100=165кб

Page 57: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

RB lite v8 lite

Page 58: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Почти продакшен

html += "foo";html += rb(id);html += "bar";

Page 59: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Почти продакшен

html += "foo"; push_string("foo");html += rb(id); push_rb(id);html += "bar"; push_string("bar");

Page 60: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

50% x2

Page 61: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

440 000 000

Page 62: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

440 000 000110 000 000

Page 63: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Page 64: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Данные на февраль 2012 года

Размер HTML, который генерирует v8 65кб.

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

В среднем v8 требует 40MB на контекст.

Page 65: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Пол года спустя

Ни одной утечки памяти

Ни одного падения v8

Touch главная

Touch почта

Page 66: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Проблемы v8

Page 67: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

http://sysoev.ru/prog/v8.html

Page 68: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Page 69: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Полезные ссылки

— http://code.google.com/p/v8/— https://github.com/mailru/fest— http://sysoev.ru/prog/v8.html

Андрей Сумин, [email protected]

Page 70: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

Возможности fest

Page 71: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:value

<fest:value>json.name</fest:value>try {

html += escape(json.name);} catch(e) {

log(e.message);}

Page 72: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:value

<fest:value output="text">json.name</fest:value>try {

html += json.name;} catch(e) {

log(e.message);}

Page 73: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:value

<fest:value safe="true">json.name</fest:value>

html += json.name;

Page 74: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:if

<fest:if test="json.condition">…</fest:if>

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

If (condition){ … }

Page 75: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:choose

<fest:choose><fest:when test="json.condition">…</fest:when><fest:when test="false">…</fest:when><fest:otherwise>…</fest:otherwise>

</fest:choose>

Page 76: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:choose

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

try{ condition = false } catch(e) { log(e) }if (condition){}else {} }

Page 77: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

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++) { … }

Page 78: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:for

<fest:for iterate="hash" index="i"></fest:for>var i;try{ for = hash } catch(e) { for={}; log(e) }for(i in for) { … }

Page 79: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:space

<fest:space/>

html += " ";

Page 80: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:script

<fest:script> … </fest:script>

try{ … } catch (e) { log(e) }

Page 81: Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference

fest:insert

<script><fest:insert src="script.js"/>

</script>

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