Upgrade to Pro — share decks privately, control downloads, hide ads and more …

5 production Node.js stories at OdessaJS 2017

5 production Node.js stories at OdessaJS 2017

5 production story with Node.js problems. For every story, there are an issue, wrong solution for the issue, problem reason and best practice to avoid such problem.

Video from OdessaJS is available here.

Nikita Galkin

July 01, 2017
Tweet

More Decks by Nikita Galkin

Other Decks in Programming

Transcript

  1. Галкин Никита Люблю и умею: ▰ Node.js, OpenSource, TypeScript, Docker,

    AWS ▰ Распиливать монолиты на микросервисы Верю: ▰ Проблем нужно решать на правильном уровне ▰ Сложности в людях, а не технологиях ▰ Идеи и решения надо “продавать” Доклады: ▰ Spec driven development in Microservices ▰ Использовании TypeScript для Node.js приложений ▰ Best practices of Node.js use in production ▰ Testing in Node.js World Ссылки: GitHub Twitter Facebook 2
  2. Hard ▰ Base FE or Mobile ▰ DB ▰ Base

    Linux + DevOps ▰ Protocols (HTTP, bin, WS) ▰ Utils (git, docker, etc) ▰ StackoverflowDD Требования к Node.js разработчику Soft ▰ English ▰ Мотивация учить технологии ▰ Умение работать в команде ▰ Адекватность 4
  3. ▰ Уровень зарплат аналогичен Java ▰ Опыта меньше ▰ Часто

    переходят из Front-end разработки ▰ Технологии очень быстро меняются Факты о Node.js разработчиках 5
  4. ▰ Node.js не как CLI tools ▰ Не AWS Lambda

    ▰ Node.js server работает в production Детали 7
  5. Компания: Distributed with outsource Проект: web server on embedded Задача:

    Обеспечить установку прошивки оффлайн Детали 9
  6. Теория ▰ Существуют pre<scriptname> и post<scriptname> hooks ▰ Во время

    postinstall происходит установка и компиляция bin-ой части вашего приложения ▰ Компиляция и установка являются OS, node version, cpu architecture зависимыми ▰ [Лайфхак]: Стоит использовать optionalDependencies для OS- зависимых пакетов. 13
  7. Компания: Big product company Проект: Поиск и выдача сложно- структурированных

    данных Задача: Изменить структура ответа для UI Детали 17
  8. ▰ UI хочет другую структуру данных ▰ Nginx не кэширует

    эти динамические запросы ▰ Node.js использует дешевые сервера ▰ Solr использует дорогие сервера. Кэшировать дорого по железу. Шаги запроса 20
  9. ▰ UI хочет 10-100кб ▰ Nginx не кэширует эти динамические

    запросы ▰ Node.js трансформирует 3Мб ▰ Solr отдает 3 Мб Шаги запроса 22
  10. Теория ▰ Node.js однопроцессорна по своей природе ▰ Существует Event

    Loop ▰ Большое значение Event Loop Delay свидетельствует о плохой архитектуре кода Node.js приложения ▰ Для самоконтроля стоит использовать модуль blocked или его аналоги ▰ PM2 показывает Event Loop Delay из коробки 24
  11. Как выключать? 35 let server = app.listen(settings.port, () => {

    logger.info(`Server started on port ${settings.port} with pid ${process.pid}`); }); function stopHandler() { server.close(); process.exit(); } process.on("SIGTERM", stopHandler);
  12. Теория ▰ Подготовка ▻ Имейте доступ ко всем соединениям ▻

    Сохраняйти id таймеров и интервалов ▻ Повести process.on для сигналов и exit ▰ Выключение ▻ Выключите все соединения ▻ Остановите все таймеры и интервалы ▻ Добавьте таймер, если остановка будет слишком долгой 37
  13. Компания: Outstaff company Проект: Mobile application with Node.js backend Ситуация:

    Новая версия Node.js сервера не запустилась. Старая тоже перестала запускаться Детали 40
  14. ▰ Npm 4. Shrinkwrap не использовался ▰ Зависимость третьего уровня

    обновилась, поэтому все перестало работать ▰ С NPM 5 и package-lock.json этого не случится В двух словах 41
  15. ▰ OoM killer убил MongoDB ▰ До этого он убивал

    Node.js ▰ А PM2 рестартил Node.js ▰ Почему течет нода не ясно * Постмортемы Постмортем* 44
  16. ▰ Возьмем server побольше ▰ Добавим мониторинг на OoM Killer

    ▰ Запустим Node.js в дебаг режиме ▰ Дождемся как поплывет память Решение 45
  17. ▰ node --inspect ▰ Node inspector manager (NIM) ▰ Memory

    snapshot ▰ sigusr1 переведет Node.js в дебаг Теория 48
  18. ▰ npm install важен ▰ Используйте debug ▰ Graceful Shutdown

    ▰ Избегайте Event Loop блокировок ▰ Учите Node.js Выводы 51