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

51

Upload: yandex

Post on 16-Jun-2015

1.495 views

Category:

Documents


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 2: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

Яндекс

Авто 2.0 на Node.js

Вячеслав Олиянчук,

разработчик интерфейсов

auto2.yandex.ru

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

Пример с сайта 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

Page 4: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 5: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

Архитектура

Page 6: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 7: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

Model

ControllerView

User

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

ModelРесурсы

ControllerView

User

Page 9: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 10: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 11: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

Чем ходить за данными?

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

Q, When, Vow

12

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

Q, When, Vow

mean time ops/sec

Q 10.982ms 91

When 11.360ms 88

Vow 1.373ms 729

13

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

Q, When, Vow

mean time ops/sec

Q 10.982ms 91

When 11.360ms 88

Vow 1.373ms 729

bit.ly/vow-speed

14

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

Как ходить за данными?

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

Ресурс: основные методы

— Resource_Catalog.prototype.prepareRequestOpts

— Resource_Catalog.prototype.processResultData

— ResourceError

16

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

Доверяй, но проверяй

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

Ресурс: настройки

Resource_Complectations.cfg = {

timeout: 300

};

18

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

Ресурс: настройки

Resource_Complectations.cfg = {

timeout: 300,

maxRetries: 2

};

19

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

Ресурс: настройки

Resource_Complectations.cfg = {

timeout: 300,

maxRetries: 2,

cache: {

get: { keyTTL: 1000 * 60 * 60 }

}

};

20

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

Если ответа нет?

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

Сервис не доступен. Попробуйтеподождать и обновить страницу...

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

Ресурс: обязательность

// Only mandatory resources can reject promises

return resource('searcher', { ... }, { isMandatory: true })

.then(function(searchResults) {

...

});

23

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

/nodules/asker /nodules/vow-asker

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

ModelРесурсы

ControllerView

User

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

ModelРесурсы

ControllerПровайдеры

View

User

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

Контроллер: декларация блоков

{

block: 'b-content',

content: [ {

block : 'b-content-left',

data : [ 'catalog', 'related', 'articles', ... ]

} ]

}

27

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

Контроллер: провайдеры

Page.dataProviderDecl('related', 'catalog', function(data) {

return resource('related', { ... })

.then(function(related) {

data.related = related;

});

});

28

Page 29: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 30: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 31: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

ModelРесурсы

ControllerПровайдеры

View

User

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

ModelРесурсы

ControllerПровайдеры

ViewБЭМ

User

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

Формируем bemjson

bit.ly/bemjson-ref

33

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

Накладываем bemhtml

Online bemhtml compiler: bit.ly/bem-online

34

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

ModelРесурсы

ControllerПровайдеры

ViewБЭМ

User

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

ModelРесурсы

ControllerПровайдеры

ViewБЭМ

User

Page 37: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Page 38: Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js

Сусанин: добавляем роут

susanin.addRoute({

name: 'default',

pattern: '/(<controller>(/))',

conditions: { controller: [ 'search', 'index', ... ] },

defaults: { controller: 'index' },

data: { action: 'build', directory: 'pages/desktop' }

});

38

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

Сусанин: работа с роутом

var route = susanin.getRouteByName('default');

route.build(routeParams);

39

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

Сусанин: работа с роутом

var route = susanin.getRouteByName('default');

route.build(routeParams);

/*

/search?mark=bmw

/bmw

/hash#!/bmw

*/

40

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

Сусанин: строим ссылки

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

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

/nodules/susanin

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

Нагрузочное

тестирование

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

18000

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

RPS

45

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

Время ответа

Квантиль мс75% 244

90% 332

95% 404

96% 432

97% 471

99% 616

46

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

Профит

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

Frontend

Node.js App

Backend

JSON API

Backend

JSON API

Backend

XML API

Client side

Браузер

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

Спасибо за внимание!

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

готов к троллингу!

Вячеслав Олиянчук, разработчик интерфейсов.

Задавайте вопросы: @miripiruni

Пробуйте модули: github.com/nodules/

Я

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