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.
NodeJS в
HighLoad
проекте
Владимир Акрицкий
О себе
Тимлид в компании iAGE Engineering в разработке
высоконагруженных проектов
Сооснователь хакерспейса FutureLab в г.
...
О проекте
DMP (Data Management Platform) — база
данных интересов пользователей
Помечаем пользователя при помощи
Cookie
Сортируем по интересам
10 000 запросов в секунду
время ответа не более 10 мс
обработка 100+ ГБ логов в сутки
Нагрузка
7 микросервисов
около 80% кода на NodeJS
Архитектура
Никто не знает, как это готовить...
Выбор технологий
• .Net
• PHP
• Ruby
• Go
• Python
• NodeJS
Хорошее начало
Быстрая разработка
Быстрые результаты
Довольный клиент
Хорошо - хорошо, да не очень-то...
Проблемы
• Спагетти код = Callback hell
• Сторонние модули
• Утечка
• Нехватка памяти
Нехватка памяти
• 2GB хватит всем
• Максимальное увеличение до 8GB
• Обязательно учитывать этот факт и при
необходимости р...
Утечка
• Чем больше памяти уходит, тем дольше ответ
на запрос
• heapdump не дает никаких результатов
• За неделю утечки вр...
Что же делать???
Временное решение
Перезапуск приложения каждую ночь.
Cторонние модули
• Оказалось для нас самой страшной проблемой
Крах базы — крах всего
Попытка разобраться
• Ошибка воспроизводится в случайный момент
и только под определенной нагрузкой
• Откат версии не помо...
Спасение
Спустя больше месяца получили фикс
А с ним и сюрприз…..
После обновления модуля пропала утечка
Спагетти код
Модель
Модуль
Микросервис
М
М
М
1 Этап
• Выделяем большие функциональности в отдельные
проекты, они же микросервисы
• Назначаем ответственных за каждый се...
Микросервисы
Было...
≤ 3мс
Дима
Вася
Петя
Стало...
≤ 3мс
< 1мс < 1мс < 1мс
Дима
Вася
Петя
Коммуникация
• HTTP
– QPS: 10k — 30k
– Time: 1 — 3 мс
• Наша реализация
– QPS: 100+k
– Time: < 1 мс
aud-socket-server
aud-...
2 Этап
• Все, что возможно, выносим в модели, оставляя
только бизнес логику;
• Но не углубляемся в ООП;
Плюсы:
– Код стано...
Без моделей
this.db.getUsers(id, function(err, user) {
this.db.getProfiles(user.profileId, function(err, profile) {
doSomt...
С моделями
Profiles.getByUser(id, doSomthingWithProfile);
Users = {
...
}
Profiles = {
...
}
3 Этап
• Группы моделей оборачиваем в API и превращаем в
модули (npm)
Плюсы:
– Код становится переносимым
Минусы:
– Надо с...
Модули
v1.0.3
Модули
v2.0.0 v1.0.3
Package.json
"dependencies": {
...
"my_module": "git+ssh://git@gitrepo:user/repo.git#v1.0.3",
...
}
Вывод
• Дробите все на мелкие части (МММ);
• При поиске проблем в первую очередь отсекайте
все чужое;
• Не забывайте про л...
Вопросы?
Владимир Акрицкий
skype: leninlin e-mail: lenin@iage.net
Upcoming SlideShare
Loading in …5
×

NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)

4,928 views

Published on

NodeJS — достаточно молодой фреймворк, и пока не каждый решается использовать его в продакшене, а тем более в highload.

В течение последнего года мы разрабатывали проект DMP (Data Management Platform), используя NodeJS для прототипирования. На данный момент проект в большей степени все еще остался на JS и без труда справляется с текущими нагрузками в 10 000 запросов в секунду.

В докладе я расскажу, почему остановились именно на NodeJS и совсем не жалеем об этом.
К сожалению, никакое дело не обходится без граблей и костылей. Я расскажу обо всех встретившихся проблемах и уделю особое внимание проблемам со спагетти-кодом, утечками и нехваткой памяти. Как мы убили немало времени, тщетно ища источник проблем, и какие правила мы составили для себя на будущее, чтобы не повторить своих ошибок.

Расскажу немного о применении микросервисов для решения проблемы спагетти-кода.
И, как итог, опишу ряд рекомендаций, которые помогут избежать большой траты времени при использовании NodeJS.

Published in: Engineering
  • Login to see the comments

NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)

  1. 1. NodeJS в HighLoad проекте Владимир Акрицкий
  2. 2. О себе Тимлид в компании iAGE Engineering в разработке высоконагруженных проектов Сооснователь хакерспейса FutureLab в г. Ульяновске
  3. 3. О проекте DMP (Data Management Platform) — база данных интересов пользователей
  4. 4. Помечаем пользователя при помощи Cookie
  5. 5. Сортируем по интересам
  6. 6. 10 000 запросов в секунду время ответа не более 10 мс обработка 100+ ГБ логов в сутки Нагрузка
  7. 7. 7 микросервисов около 80% кода на NodeJS Архитектура
  8. 8. Никто не знает, как это готовить...
  9. 9. Выбор технологий • .Net • PHP • Ruby • Go • Python • NodeJS
  10. 10. Хорошее начало Быстрая разработка Быстрые результаты Довольный клиент
  11. 11. Хорошо - хорошо, да не очень-то...
  12. 12. Проблемы • Спагетти код = Callback hell • Сторонние модули • Утечка • Нехватка памяти
  13. 13. Нехватка памяти • 2GB хватит всем • Максимальное увеличение до 8GB • Обязательно учитывать этот факт и при необходимости разносить на процессы
  14. 14. Утечка • Чем больше памяти уходит, тем дольше ответ на запрос • heapdump не дает никаких результатов • За неделю утечки время ответа переваливало за 20 мс
  15. 15. Что же делать???
  16. 16. Временное решение Перезапуск приложения каждую ночь.
  17. 17. Cторонние модули • Оказалось для нас самой страшной проблемой
  18. 18. Крах базы — крах всего
  19. 19. Попытка разобраться • Ошибка воспроизводится в случайный момент и только под определенной нагрузкой • Откат версии не помогает • Разработчики модуля не могут воспроизвести
  20. 20. Спасение Спустя больше месяца получили фикс А с ним и сюрприз….. После обновления модуля пропала утечка
  21. 21. Спагетти код Модель Модуль Микросервис М М М
  22. 22. 1 Этап • Выделяем большие функциональности в отдельные проекты, они же микросервисы • Назначаем ответственных за каждый сервис Плюсы: – Из одной большой свалки в несколько поменьше – У ответственности есть границы Минусы: – Увеличилось время обмена данными
  23. 23. Микросервисы
  24. 24. Было... ≤ 3мс Дима Вася Петя
  25. 25. Стало... ≤ 3мс < 1мс < 1мс < 1мс Дима Вася Петя
  26. 26. Коммуникация • HTTP – QPS: 10k — 30k – Time: 1 — 3 мс • Наша реализация – QPS: 100+k – Time: < 1 мс aud-socket-server aud-socket-client
  27. 27. 2 Этап • Все, что возможно, выносим в модели, оставляя только бизнес логику; • Но не углубляемся в ООП; Плюсы: – Код становится читабельнее Минусы: – Увеличивается порог вхождения
  28. 28. Без моделей this.db.getUsers(id, function(err, user) { this.db.getProfiles(user.profileId, function(err, profile) { doSomthingWithProfile(profile); }); });
  29. 29. С моделями Profiles.getByUser(id, doSomthingWithProfile); Users = { ... } Profiles = { ... }
  30. 30. 3 Этап • Группы моделей оборачиваем в API и превращаем в модули (npm) Плюсы: – Код становится переносимым Минусы: – Надо следить за версиями в каждом микросервисе
  31. 31. Модули v1.0.3
  32. 32. Модули v2.0.0 v1.0.3
  33. 33. Package.json "dependencies": { ... "my_module": "git+ssh://git@gitrepo:user/repo.git#v1.0.3", ... }
  34. 34. Вывод • Дробите все на мелкие части (МММ); • При поиске проблем в первую очередь отсекайте все чужое; • Не забывайте про лимиты; • Воспринимайте NodeJS как прототип, который требуется впоследствии переделывать.
  35. 35. Вопросы? Владимир Акрицкий skype: leninlin e-mail: lenin@iage.net

×