Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

65 views

Published on

JS Lab2017, 25 марта, Одесса
Виталий Лебедев (Software Developer at DataArt)
Практические сложности при разработке на node.js
В этом докладе я расскажу, с какими непосредственными практическими сложностями можно встретиться при разработке на node.js, в силу тех или иных ограничений самого node.js, и какие для этих задач существуют возможные решения.
Все материалы: http://jslab.in.ua/
Организаторы: http://geekslab.org.ua/

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Тестовый слайд
  2. 2. Практические сложности и подходы к их решению при разработке на node.js Виталий Лебедев
  3. 3. npm и left-pad Или день, когда мир (JavaScript) остановился
  4. 4. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория
  5. 5. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad
  6. 6. Open-source vs Корпорации • 22 марта 2016 года, Azer Koçulu удалил 250 npm пакетов из репозитория • Среди них был небольшой (11 строк!) пакет под названием left-pad • Тысячи проектов, включая Node и Babel, зависели от этого пакета, что привело к невозможности сбилдить проекты, которые зависели от них
  7. 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. 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. 9. Проксирующие репозитории • Artifactory - поддерживает формат npm в Pro (платной) версии. • gemfury.com • Различные npm пакеты: sinopia, npm-proxy- cache, etc.
  10. 10. Какие задачи решают проксирующие/ приватные репозитории? • Кешируют пакеты на случай недоступности http:// registry.npmjs.org • Позволяют запрашивать пакет из нескольких репозиториев без лишних движений • Позволяют создавать приватные npm пакеты, не публикуя их в публичные репозитории (т.е. заменяют публичные репозитории)
  11. 11. Сохранение контекста асинхронного вызова
  12. 12. Express роуты route callback UsersService.updateUser(userData) PUT /users/:userId UsersHelperWrapper.updatePoints() UsersHelper.updatePoints()
  13. 13. Express роуты route callback UsersService.updateUser(userData, requestId) PUT /users/:userId UsersHelperWrapper.updatePoints(requestId) UsersHelper.updatePoints(requestId)
  14. 14. Express роуты route callback UsersService.updateUser(userData, session) PUT /users/:userId UsersHelperWrapper.updatePoints(session) UsersHelper.updatePoints(session)
  15. 15. • Хороший аналог - Local Thread Variables • Помогает сохранять контекст вложенных вызовов, даже при вызове колбеков с помощью process.nextTick() или timer functions (setTimeout, setInterval, setImmediate) Continuation Local Storage
  16. 16. Continuation Local Storage
  17. 17. Continuation Local Storage
  18. 18. Continuation Local Storage
  19. 19. Ссылки • https://www.npmjs.com/package/continuation- local-storage • https://github.com/TimBeyer/cls-bluebird
  20. 20. Flame Graphs и пожары, пожары, пожары…
  21. 21. CPU Utilization Spikes
  22. 22. Flame Graphs
  23. 23. Flame Graphs • Каждый бокс - вызов функции в стэке
  24. 24. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка
  25. 25. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч.,
  26. 26. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч., • Количество сэмплов в выборке может быть больше чем время выборки, потому что сэмплинг мог происходить одновременно из нескольких потоков
  27. 27. Flame Graphs • Каждый бокс - вызов функции в стэке • По оси Y - глубина стэка • По оси X - выборка. Не показывает течение времени! В т.ч., • Количество сэмплов в выборке может быть больше чем время выборки, потому что сэмплинг мог происходить одновременно из нескольких потоков • Ширина бокса представляет относительное время выполнения функции на CPU
  28. 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 приложением
  29. 29. Ссылки • 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/

×