SlideShare a Scribd company logo
Тестовый слайд
Практические сложности
и подходы к их решению
при разработке на node.js
Виталий Лебедев
npm и left-pad
Или день, когда мир (JavaScript) остановился
Open-source vs
Корпорации
• 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
Open-source vs
Корпорации
• 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
• Среди них был небольшой (11 строк!) пакет под названием left-pad
Open-source vs
Корпорации
• 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
• Среди них был небольшой (11 строк!) пакет под названием left-pad
• Тысячи проектов, включая Node и Babel, зависели от этого пакета, что
привело к невозможности сбилдить проекты, которые зависели от них
Open-source vs
Корпорации
• 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
• Среди них был небольшой (11 строк!) пакет под названием left-pad
• Тысячи проектов, включая Node и Babel, зависели от этого пакета, что
привело к невозможности сбилдить проекты, которые зависели от них
• Причиной послужило обращение юристов компании "Kik Interactive
Inc" (владельцев мессенджера Kik) в npm, после чего был удален
одноименный пакет Azer Koçulu
Open-source vs
Корпорации
• 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
• Среди них был небольшой (11 строк!) пакет под названием left-pad
• Тысячи проектов, включая Node и Babel, зависели от этого пакета, что
привело к невозможности сбилдить проекты, которые зависели от них
• Причиной послужило обращение юристов компании "Kik Interactive
Inc" (владельцев мессенджера Kik) в npm, после чего был удален
одноименный пакет Azer Koçulu
• Посчитав это нарушением прав и свобод Open Source комьюнити, автор
удалил все остальные опубликованные им пакеты
Проксирующие
репозитории
• Artifactory - поддерживает формат npm в Pro
(платной) версии.
• gemfury.com
• Различные npm пакеты: sinopia, npm-proxy-
cache, etc.
Какие задачи решают проксирующие/
приватные репозитории?
• Кешируют пакеты на случай недоступности http://
registry.npmjs.org
• Позволяют запрашивать пакет из нескольких
репозиториев без лишних движений
• Позволяют создавать приватные npm пакеты, не
публикуя их в публичные репозитории (т.е.
заменяют публичные репозитории)
Сохранение контекста
асинхронного вызова
Express роуты
route callback
UsersService.updateUser(userData)
PUT /users/:userId
UsersHelperWrapper.updatePoints()
UsersHelper.updatePoints()
Express роуты
route callback
UsersService.updateUser(userData, requestId)
PUT /users/:userId
UsersHelperWrapper.updatePoints(requestId)
UsersHelper.updatePoints(requestId)
Express роуты
route callback
UsersService.updateUser(userData, session)
PUT /users/:userId
UsersHelperWrapper.updatePoints(session)
UsersHelper.updatePoints(session)
• Хороший аналог - Local Thread Variables
• Помогает сохранять контекст вложенных
вызовов, даже при вызове колбеков с помощью
process.nextTick() или timer functions (setTimeout,
setInterval, setImmediate)
Continuation Local Storage
Continuation Local Storage
Continuation Local Storage
Continuation Local Storage
Ссылки
• https://www.npmjs.com/package/continuation-
local-storage
• https://github.com/TimBeyer/cls-bluebird
Flame Graphs и пожары,
пожары, пожары…
CPU Utilization Spikes
Flame Graphs
Flame Graphs
• Каждый бокс - вызов функции в стэке
Flame Graphs
• Каждый бокс - вызов функции в стэке
• По оси Y - глубина стэка
Flame Graphs
• Каждый бокс - вызов функции в стэке
• По оси Y - глубина стэка
• По оси X - выборка. Не показывает течение времени! В т.ч.,
Flame Graphs
• Каждый бокс - вызов функции в стэке
• По оси Y - глубина стэка
• По оси X - выборка. Не показывает течение времени! В т.ч.,
• Количество сэмплов в выборке может быть больше чем время
выборки, потому что сэмплинг мог происходить одновременно
из нескольких потоков
Flame Graphs
• Каждый бокс - вызов функции в стэке
• По оси Y - глубина стэка
• По оси X - выборка. Не показывает течение времени! В т.ч.,
• Количество сэмплов в выборке может быть больше чем время
выборки, потому что сэмплинг мог происходить одновременно
из нескольких потоков
• Ширина бокса представляет относительное время выполнения
функции на CPU
Flame Graph: как?
• https://nodejs.org/en/blog/uncategorized/profiling-node-js/
• Шаги:
• Запустите ваше node.js приложение
• В другом окне терминала, запустите dtrace для захвата стектрейсов всех запущенных
node процессов: 

$ sudo dtrace -n 'profile-97/execname == "node" && arg1/{@[ustack(100)] = count(); }
tick-60s { exit(0); }' > stacks.out
• Вывод команды будет сохранен в файл stacks.out
• Теперь мы можем использовать утилиту stackvis для того, чтобы получить наш flame
graph из полученного файла:

$ yarn global add stackvis

$ stackvis dtrace flamegraph-svg < stacks.out > stacks.svg
• На выходе мы получим красивый файл stacks.svg, содержащий flame graph и
позволяющий проанализировать использование CPU приложением
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
Ссылки
• http://techblog.netflix.com/2014/11/nodejs-in-flames.html
• http://www.brendangregg.com/FlameGraphs/
cpuflamegraphs.html
• http://www.brendangregg.com/flamegraphs.html
• https://nodejs.org/en/blog/uncategorized/profiling-node-
js/
• http://dtrace.org/blogs/dap/2012/01/05/where-does-your-
node-program-spend-its-time/

More Related Content

PDF
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
PDF
Юрий Насретдинов, Badoo
PDF
Ровная балансировка нагрузки на фронтенд-кластере
PPTX
Андрей Акиньшин
PDF
2013-10-05 02 Алексей Родионов. Как сделать свой Travis CI - Vagrant + KVM
PDF
Алексей Федоров
PPTX
Docker в работе: взгляд на использование в Badoo через год
PDF
Containers in real world презентация
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Юрий Насретдинов, Badoo
Ровная балансировка нагрузки на фронтенд-кластере
Андрей Акиньшин
2013-10-05 02 Алексей Родионов. Как сделать свой Travis CI - Vagrant + KVM
Алексей Федоров
Docker в работе: взгляд на использование в Badoo через год
Containers in real world презентация

What's hot (17)

PPTX
Евгений Потапов (Сумма Айти)
PDF
Архитектура хранения фотографий в Badoo
PDF
Депрокрастинируем Docker: контейнеры здесь и сейчас
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
Облако в Badoo год спустя
PDF
Путь к Go на конкретном примере
PDF
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
PDF
Docker & Puppet: как их скрестить и надо ли вам это?
PPTX
Антон Турецкий
PDF
Константин Осипов
PDF
Benchmarking PostgreSQL in Linux and FreeBSD
PDF
Где живут Ваши объявления / Тюрин Михаил (Avito)
PDF
[Demo-day] Slava Mogilevsky: "Cluster CI on Jenkins"
PPTX
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
PPTX
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
PDF
My talk on LeoFS, Highload++ 2014
PDF
My talk on Salt and Ansible from DevConf 2014
Евгений Потапов (Сумма Айти)
Архитектура хранения фотографий в Badoo
Депрокрастинируем Docker: контейнеры здесь и сейчас
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Облако в Badoo год спустя
Путь к Go на конкретном примере
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Docker & Puppet: как их скрестить и надо ли вам это?
Антон Турецкий
Константин Осипов
Benchmarking PostgreSQL in Linux and FreeBSD
Где живут Ваши объявления / Тюрин Михаил (Avito)
[Demo-day] Slava Mogilevsky: "Cluster CI on Jenkins"
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
My talk on LeoFS, Highload++ 2014
My talk on Salt and Ansible from DevConf 2014
Ad

Viewers also liked (15)

PDF
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
PDF
JS Lab2017_Lightning Talks_React Perfomance
PPTX
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
PDF
JS Lab2017_Lightning Talks_Рекрутинг.js
PDF
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
PDF
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
PDF
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
PPTX
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
PPTX
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
PDF
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
PDF
JS Lab2017_Алексей Заславский_React Fiber
PDF
JS Lab2017_Сергей Селецкий_System.js и jspm
PDF
WebCamp 2016: Python.Максим Климишин.Типизированный Python
PDF
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
PDF
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
JS Lab2017_Lightning Talks_React Perfomance
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Lightning Talks_Рекрутинг.js
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
JS Lab2017_Алексей Заславский_React Fiber
JS Lab2017_Сергей Селецкий_System.js и jspm
WebCamp 2016: Python.Максим Климишин.Типизированный Python
AI&BigData Lab 2016. Сергей Шельпук: Методология Data Science проектов
JS Lab2017_Redux: время двигаться дальше?_Екатерина Лизогубова
Ad

Similar to JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js (20)

PDF
Бэкенд, фронтенд — всё смешалось (nodkz)
PDF
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
PDF
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
Node.js Меньше сложности, больше надежности Holy.js 2021
PPTX
What do you MEAN? или введение в Fullstack JavaScript
PDF
Introduction in Node.js (in russian)
PPT
Типичный стек технологий для использования с Node.js
PDF
Что такое современная Frontend разработка
PDF
JavaScript сегодня: React, Redux и новая реальность
PDF
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальность
PDF
Desktop app based on node js and html5
PDF
Изоморфные react-приложения
PDF
YaC 2013 Notes
PDF
NPM и модульная архитектура приложения
PDF
D2D Pizza JS Илья Беда "Куда мы все катимся?"
PDF
Remote (dev)tools своими руками
PDF
ES6 Generators On Koa.js Example
PDF
Изоморфные React-приложения: производительность и масштабирование
PDF
REPL в Node.js: улучшаем быт разработчик
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js Меньше сложности, больше надежности Holy.js 2021
What do you MEAN? или введение в Fullstack JavaScript
Introduction in Node.js (in russian)
Типичный стек технологий для использования с Node.js
Что такое современная Frontend разработка
JavaScript сегодня: React, Redux и новая реальность
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальность
Desktop app based on node js and html5
Изоморфные react-приложения
YaC 2013 Notes
NPM и модульная архитектура приложения
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Remote (dev)tools своими руками
ES6 Generators On Koa.js Example
Изоморфные React-приложения: производительность и масштабирование
REPL в Node.js: улучшаем быт разработчик

More from GeeksLab Odessa (19)

PDF
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
PDF
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
PDF
DataScience Lab 2017_Блиц-доклад_Турский Виктор
PDF
DataScience Lab 2017_Обзор методов детекции лиц на изображение
PDF
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
PDF
DataScienceLab2017_Блиц-доклад
PDF
DataScienceLab2017_Блиц-доклад
PDF
DataScienceLab2017_Блиц-доклад
PDF
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
PDF
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
PDF
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
PDF
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
PDF
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
PDF
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
PDF
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
PDF
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
PDF
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
PDF
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
PDF
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...

JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js

  • 2. Практические сложности и подходы к их решению при разработке на node.js Виталий Лебедев
  • 3. npm и left-pad Или день, когда мир (JavaScript) остановился
  • 4. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
  • 5. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad
  • 6. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad • Тысячи проектов, включая Node и Babel, зависели от этого пакета, что привело к невозможности сбилдить проекты, которые зависели от них
  • 7. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad • Тысячи проектов, включая Node и Babel, зависели от этого пакета, что привело к невозможности сбилдить проекты, которые зависели от них • Причиной послужило обращение юристов компании "Kik Interactive Inc" (владельцев мессенджера Kik) в npm, после чего был удален одноименный пакет Azer Koçulu
  • 8. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad • Тысячи проектов, включая Node и Babel, зависели от этого пакета, что привело к невозможности сбилдить проекты, которые зависели от них • Причиной послужило обращение юристов компании "Kik Interactive Inc" (владельцев мессенджера Kik) в npm, после чего был удален одноименный пакет Azer Koçulu • Посчитав это нарушением прав и свобод Open Source комьюнити, автор удалил все остальные опубликованные им пакеты
  • 9. Проксирующие репозитории • Artifactory - поддерживает формат npm в Pro (платной) версии. • gemfury.com • Различные npm пакеты: sinopia, npm-proxy- cache, etc.
  • 10. Какие задачи решают проксирующие/ приватные репозитории? • Кешируют пакеты на случай недоступности http:// registry.npmjs.org • Позволяют запрашивать пакет из нескольких репозиториев без лишних движений • Позволяют создавать приватные npm пакеты, не публикуя их в публичные репозитории (т.е. заменяют публичные репозитории)
  • 12. Express роуты route callback UsersService.updateUser(userData) PUT /users/:userId UsersHelperWrapper.updatePoints() UsersHelper.updatePoints()
  • 13. Express роуты route callback UsersService.updateUser(userData, requestId) PUT /users/:userId UsersHelperWrapper.updatePoints(requestId) UsersHelper.updatePoints(requestId)
  • 14. Express роуты route callback UsersService.updateUser(userData, session) PUT /users/:userId UsersHelperWrapper.updatePoints(session) UsersHelper.updatePoints(session)
  • 15. • Хороший аналог - Local Thread Variables • Помогает сохранять контекст вложенных вызовов, даже при вызове колбеков с помощью process.nextTick() или timer functions (setTimeout, setInterval, setImmediate) Continuation Local Storage
  • 20. Flame Graphs и пожары, пожары, пожары…
  • 23. Flame Graphs • Каждый бокс - вызов функции в стэке
  • 24. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка
  • 25. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч.,
  • 26. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч., • Количество сэмплов в выборке может быть больше чем время выборки, потому что сэмплинг мог происходить одновременно из нескольких потоков
  • 27. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч., • Количество сэмплов в выборке может быть больше чем время выборки, потому что сэмплинг мог происходить одновременно из нескольких потоков • Ширина бокса представляет относительное время выполнения функции на CPU
  • 28. Flame Graph: как? • https://nodejs.org/en/blog/uncategorized/profiling-node-js/ • Шаги: • Запустите ваше node.js приложение • В другом окне терминала, запустите dtrace для захвата стектрейсов всех запущенных node процессов: 
 $ sudo dtrace -n 'profile-97/execname == "node" && arg1/{@[ustack(100)] = count(); } tick-60s { exit(0); }' > stacks.out • Вывод команды будет сохранен в файл stacks.out • Теперь мы можем использовать утилиту stackvis для того, чтобы получить наш flame graph из полученного файла:
 $ yarn global add stackvis
 $ stackvis dtrace flamegraph-svg < stacks.out > stacks.svg • На выходе мы получим красивый файл stacks.svg, содержащий flame graph и позволяющий проанализировать использование CPU приложением
  • 30. Ссылки • http://techblog.netflix.com/2014/11/nodejs-in-flames.html • http://www.brendangregg.com/FlameGraphs/ cpuflamegraphs.html • http://www.brendangregg.com/flamegraphs.html • https://nodejs.org/en/blog/uncategorized/profiling-node- js/ • http://dtrace.org/blogs/dap/2012/01/05/where-does-your- node-program-spend-its-time/