Яндекс
Авто 2.0 на Node.js
Вячеслав Олиянчук,
разработчик интерфейсов
auto2.yandex.ru
Пример с сайта nodejs.org
var http = require('http');
http
.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
3
Архитектура
Model
ControllerView
User
ModelРесурсы
ControllerView
User
Чем ходить за данными?
Q, When, Vow
12
Q, When, Vow
mean time ops/sec
Q 10.982ms 91
When 11.360ms 88
Vow 1.373ms 729
13
Q, When, Vow
mean time ops/sec
Q 10.982ms 91
When 11.360ms 88
Vow 1.373ms 729
bit.ly/vow-speed
14
Как ходить за данными?
Ресурс: основные методы
— Resource_Catalog.prototype.prepareRequestOpts
— Resource_Catalog.prototype.processResultData
— ResourceError
16
Доверяй, но проверяй
Ресурс: настройки
Resource_Complectations.cfg = {
timeout: 300
};
18
Ресурс: настройки
Resource_Complectations.cfg = {
timeout: 300,
maxRetries: 2
};
19
Ресурс: настройки
Resource_Complectations.cfg = {
timeout: 300,
maxRetries: 2,
cache: {
get: { keyTTL: 1000 * 60 * 60 }
}
};
20
Если ответа нет?
Сервис не доступен. Попробуйтеподождать и обновить страницу...
Ресурс: обязательность
// Only mandatory resources can reject promises
return resource('searcher', { ... }, { isMandatory: true })
.then(function(searchResults) {
...
});
23
/nodules/asker /nodules/vow-asker
ModelРесурсы
ControllerView
User
ModelРесурсы
ControllerПровайдеры
View
User
Контроллер: декларация блоков
{
block: 'b-content',
content: [ {
block : 'b-content-left',
data : [ 'catalog', 'related', 'articles', ... ]
} ]
}
27
Контроллер: провайдеры
Page.dataProviderDecl('related', 'catalog', function(data) {
return resource('related', { ... })
.then(function(related) {
data.related = related;
});
});
28
ModelРесурсы
ControllerПровайдеры
View
User
ModelРесурсы
ControllerПровайдеры
ViewБЭМ
User
Формируем bemjson
bit.ly/bemjson-ref
33
Накладываем bemhtml
Online bemhtml compiler: bit.ly/bem-online
34
ModelРесурсы
ControllerПровайдеры
ViewБЭМ
User
ModelРесурсы
ControllerПровайдеры
ViewБЭМ
User
Сусанин: добавляем роут
susanin.addRoute({
name: 'default',
pattern: '/(<controller>(/))',
conditions: { controller: [ 'search', 'index', ... ] },
defaults: { controller: 'index' },
data: { action: 'build', directory: 'pages/desktop' }
});
38
Сусанин: работа с роутом
var route = susanin.getRouteByName('default');
route.build(routeParams);
39
Сусанин: работа с роутом
var route = susanin.getRouteByName('default');
route.build(routeParams);
/*
/search?mark=bmw
/bmw
/hash#!/bmw
*/
40
Сусанин: строим ссылки
data.link('route-name', {
mark: data.mark.id,
model: data.model.id,
year_from: data.generation.years.from,
year_to: data.generation.years.to
});
41
/nodules/susanin
Нагрузочное
тестирование
18000
RPS
45
Время ответа
Квантиль мс75% 244
90% 332
95% 404
96% 432
97% 471
99% 616
46
Профит
Frontend
Node.js App
Backend
JSON API
Backend
JSON API
Backend
XML API
Client side
Браузер
Спасибо за внимание!
готов к троллингу!
Вячеслав Олиянчук, разработчик интерфейсов.
Задавайте вопросы: @miripiruni
Пробуйте модули: github.com/nodules/
Я