Вячеслав Олиянчук — Яндекс.Авто 2.0 на node.js

Post on 16-Jun-2015

1.497 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

В докладе рассказывается о том, как наша команда запускала проект Авто 2.0 на Node.js. Обсуждаются проблемы деплоя, архитектура сервиса и некоторые особенности в Node.js, которые удалось обойти в процессе эксплуатации.

TRANSCRIPT

Яндекс

Авто 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/

Я

top related