nodejs в highload проекте / Акрицкий Владимир (iage engineering)

35
NodeJS в HighLoad проекте Владимир Акрицкий

Upload: ontico

Post on 06-Jan-2017

2.071 views

Category:

Engineering


10 download

TRANSCRIPT

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

NodeJS в HighLoad проектеВладимир Акрицкий

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

О себе

Тимлид в компании iAGE Engineering в разработке высоконагруженных проектов

Сооснователь хакерспейса FutureLab в г. Ульяновске

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

О проектеDMP (Data Management Platform) — база данных интересов пользователей

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

Помечаем пользователя при помощи Cookie

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

Сортируем по интересам

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

10 000 запросов в секунду

время ответа не более 10 мс

обработка 100+ ГБ логов в сутки

Нагрузка

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

7 микросервисов

около 80% кода на NodeJS

Архитектура

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

Никто не знает, как это готовить...

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

Выбор технологий

• .Net

• PHP

• Ruby

• Go

• Python

• NodeJS

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

Хорошее начало

Быстрая разработка

Быстрые результаты

Довольный клиент

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

Хорошо - хорошо, да не очень-то...

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

Проблемы

• Спагетти код = Callback hell

• Сторонние модули

• Утечка

• Нехватка памяти

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

Нехватка памяти

• 2GB хватит всем

• Максимальное увеличение до 8GB

• Обязательно учитывать этот факт и при необходимости разносить на процессы

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

Утечка

• Чем больше памяти уходит, тем дольше ответ на запрос

• heapdump не дает никаких результатов

• За неделю утечки время ответа переваливало за 20 мс

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

Что же делать???

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

Временное решениеПерезапуск приложения каждую ночь.

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

Cторонние модули

• Оказалось для нас самой страшной проблемой

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

Крах базы — крах всего

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

Попытка разобраться

• Ошибка воспроизводится в случайный момент и только под определенной нагрузкой

• Откат версии не помогает

• Разработчики модуля не могут воспроизвести

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

Спасение

Спустя больше месяца получили фикс

А с ним и сюрприз…..

После обновления модуля пропала утечка

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

Спагетти код

Модель

Модуль

Микросервис

М

М

М

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

1 Этап• Выделяем большие функциональности в отдельные

проекты, они же микросервисы

• Назначаем ответственных за каждый сервис

Плюсы:

– Из одной большой свалки в несколько поменьше

– У ответственности есть границы

Минусы:

– Увеличилось время обмена данными

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

Микросервисы

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

Было...

≤ 3мс

Дима

Вася

Петя

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

Стало...

≤ 3мс

< 1мс < 1мс < 1мс

Дима

Вася

Петя

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

Коммуникация• HTTP

– QPS: 10k — 30k– Time: 1 — 3 мс

• Наша реализация

– QPS: 100+k– Time: < 1 мс

aud-socket-server

aud-socket-client

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

2 Этап• Все, что возможно, выносим в модели, оставляя

только бизнес логику;

• Но не углубляемся в ООП;

Плюсы:

– Код становится читабельнее

Минусы:

– Увеличивается порог вхождения

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

Без моделей

this.db.getUsers(id, function(err, user) {

this.db.getProfiles(user.profileId, function(err, profile) {

doSomthingWithProfile(profile);

});

});

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

С моделями

Profiles.getByUser(id, doSomthingWithProfile);

Users = {

...

}

Profiles = {

...

}

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

3 Этап• Группы моделей оборачиваем в API и превращаем в

модули (npm)

Плюсы:

– Код становится переносимым

Минусы:

– Надо следить за версиями в каждом микросервисе

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

Модули

v1.0.3

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

Модули

v2.0.0 v1.0.3

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

Package.json

"dependencies": {

...

"my_module": "git+ssh://git@gitrepo:user/repo.git#v1.0.3",

...

}

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

Вывод• Дробите все на мелкие части (МММ);

• При поиске проблем в первую очередь отсекайте все чужое;

• Не забывайте про лимиты;

• Воспринимайте NodeJS как прототип, который требуется впоследствии переделывать.

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

Вопросы?

Владимир Акрицкий

skype: leninlin e-mail: [email protected]