JS Lab2017, 25 марта, Одесса
Виталий Лебедев (Software Developer at DataArt)
Практические сложности при разработке на node.js
В этом докладе я расскажу, с какими непосредственными практическими сложностями можно встретиться при разработке на node.js, в силу тех или иных ограничений самого node.js, и какие для этих задач существуют возможные решения.
Все материалы: http://jslab.in.ua/
Организаторы: http://geekslab.org.ua/
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 комьюнити, автор
удалил все остальные опубликованные им пакеты
10. Какие задачи решают проксирующие/
приватные репозитории?
• Кешируют пакеты на случай недоступности http://
registry.npmjs.org
• Позволяют запрашивать пакет из нескольких
репозиториев без лишних движений
• Позволяют создавать приватные npm пакеты, не
публикуя их в публичные репозитории (т.е.
заменяют публичные репозитории)
15. • Хороший аналог - Local Thread Variables
• Помогает сохранять контекст вложенных
вызовов, даже при вызове колбеков с помощью
process.nextTick() или timer functions (setTimeout,
setInterval, setImmediate)
Continuation Local Storage
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 приложением