Вот 10 правил производительности, за которыми мы следуем при использовании node.js:
1. Избегайте использования синхронного кода
С точки зрения дизайна, node.js является однопоточным. Чтобы позволить одному потоку обрабатывать множество одновременных запросов, вы никогда не сможете позволить потоке ждать блокировки, синхронных или длительных операций. Отличительной особенностью node.js является то, что она разработана и реализована сверху вниз для достижения асинхронного. Это делает его очень подходящим для программ типа событий.
К сожалению, все еще есть вероятность, что будут происходить синхронные/блокирующие вызовы. Например, многие операции файловой системы имеют как синхронные, так и асинхронные версии, такие как writefile и writefilesync. Даже если вы используете код для управления методом синхронизации, все еще возможно использовать библиотеку внешних функций, которая непреднамеренно блокирует вызовы. Когда вы делаете это, влияние на производительность огромно.
// хорошо: записать файлы asynchronyfs.writefile ('message.txt', 'hello node', function (err) {console.log («Это сохранено, и сервер остается отзывчивым!»);}); // Плохо: записать файлы synchronyfs.writefilesync ('message.txt', 'hello node'); console.log («Это сохранено, но вы просто заблокировали все запросы!»);Наш журнал инициализации непреднамеренно включает в себя синхронный вызов для написания контента на диск при реализации. Если мы не проведем тестирование производительности, будет легко игнорировать эту проблему. При использовании экземпляра node.js в поле разработчика в качестве стандартного теста этот синхронный вызов приведет к снижению производительности с тысяч запросов в секунду до всего лишь нескольких десятков.
2. Закройте бассейн
Node.js 'http client будет автоматически использовать бассейны сокетов: по умолчанию он ограничит только 5 сокетов на хост. Хотя повторное использование гнезда может привести к увеличению контроля ресурсов, если вам необходимо справиться с одновременными запросами от одного и того же хоста, это приведет к ряду узких мест. В этом случае рекомендуется повысить ценность максимальных
// Отключить объединение сокетов var http = require ('http'); var options = {.....}; options.agent = false; var req = http.request (options)3. Не позволяйте статическим ресурсам использовать node.js
Для статических ресурсов, таких как CSS и изображения, используйте стандартный веб -сервер вместо node.js. Например, LinkedIn Mobile использует Nginx. Мы также используем сети доставки контента (CDN), которые могут копировать статические ресурсы по всему миру на серверы. Это имеет два преимущества: (1) это может уменьшить нагрузку на нашем сервере Node.js (2) CDN может позволить статическому содержимому доставке на серверах ближе к пользователю, тем самым сокращая время ожидания.
4. рендер на клиенте
Давайте быстро сравним разницу между рендерингом сервера и рендерингом клиента. Если мы используем node.js для рендеринга на стороне сервера, для каждого запроса мы отправляем обратно HTML -страницу, например, следующее:
<!-Пример простой веб-страницы, выполненной полностью на стороне сервера-> <! Doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <img src = "http://mobile-cdn.linkedin.com/images/linkedin.png"/> heallincedin. </div> </body> </html>
Пожалуйста, обратите внимание на наблюдение за всем содержимым этой страницы, за исключением имени пользователя, остальное является статичным: содержимое, перегруженное каждым пользователем, и страница одинакова. Следовательно, более эффективный подход состоит в том, чтобы позволить node.js возвращать только динамическое содержание, требуемое страницей в форме JSON.
{"Имя": "Джон"}
Остальная часть страницы - все статические теги HTML - могут быть размещены в шаблонах JavaScript (например, шаблон underscore.js):
<!-Пример шаблона JavaScript, который может быть сделан клиентской стороной-> <! Doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <img src = "http://mobile-cdn.linkedin.com/image/linkedin. Имя %>! </div> </body> </html>
Повышение производительности происходит из этих мест: как говорится в третьем точке, статические шаблоны JavaScript могут быть предоставлены на стороне сервера через WebServer (например, Nginx) или реализованы с помощью лучших CDN. Кроме того, шаблоны JavaScript могут быть кэшированы в браузере или храниться локально. После того, как все начальные страницы загружаются, единственные данные, которые необходимо отправить клиенту, - это JSON, что будет наиболее эффективным. Этот метод может значительно уменьшить нагрузку на процессор, io и node.js.
5. Используйте Gzip
Многие серверы и клиенты поддерживают GZIP для сжатия запросов и ответов. Независимо от того, отвечаете ли вы на клиента или отправляете запрос на удаленный сервер, обязательно используйте его.
6. Параллелизация
Попробуйте, чтобы все ваши операции блокировки - отправьте запросы, вызовы БД и параллелизацию доступа к файловой системе с удаленными службами. Это сократит время ожидания самой медленной операции блокировки, а не время ожидания всех операций блокировки. Чтобы сохранить обратные вызовы и обработку ошибок в чистоте, мы используем шаг для управления трафиком.
7. Либерализация
LinkedIn Mobile использует Express Framework для управления циклами запроса/ответов. Многие экспресс -примеры включают в себя следующую конфигурацию:
app.use (express.session ({секрет: "клавишная кошка"}));
По умолчанию данные сеанса хранятся в памяти, которая добавляет огромные накладные расходы на сервер, особенно когда число пользователей увеличивается. Вы можете использовать внешний магазин сеансов, такой как MongoDB или Redis, но каждый запрос приведет к накладным расходам удаленных вызовов для получения данных сеанса. Когда это возможно, наилучшим вариантом является хранение всех данных без сохранения состояния на стороне сервера. Либерализация сеанса, не включив вышеуказанную экспресс -конфигурацию, вы увидите лучшую производительность.
8. Используйте двоичные модули
Если возможно, замените модули JavaScript на двоичные модули. Например, когда мы конвертируем из модуля SHA, записанного в JavaScript в составленную версию Node.js, мы видим большой скачок вперед в производительности:
// Использование встроенного или двоичного модуля crypto = require ('crypto'); var hash = crypto.createhmac ("sha1", key) .update (signature base) .digest ("base64");9. Замените клиентскую библиотеку стандартным v8 JavaScript
Многие библиотеки JavaScript создаются для использования в веб -браузерах, потому что в средах JavaScript, например, некоторые браузеры поддерживают такие функции, как Foreach, Map и сокращение, но некоторые браузеры этого не делают. Поэтому клиентские библиотеки обычно используют много неэффективного кода для преодоления различий в браузерах. С другой стороны, в node.js вы можете точно знать, какие методы JavaScript эффективны: V8 JavaScript Engine поддерживает node.js для реализации ECMASCRIPT, указанного в пятом издании ECMA-262. Непосредственно замените клиентскую библиотеку стандартными функциями v8 JavaScript, вы найдете значительные улучшения производительности.
10. Держите свой код маленьким и легким
Использование мобильного устройства сделает доступ к доступу медленным и задержкой высоким, что говорит нам, чтобы наш код был маленьким и легким. Та же философия поддерживается для кода сервера. Время от времени оглядывайтесь на свое решение и задайте себе такие вопросы, как: «Действительно ли нам этот модуль?», «Почему мы используем эту структуру? Стоит ли на нас накладные расходы?», «Можем ли мы реализовать его простым способом?». Маленький и легкий код обычно более эффективен и быстр.
Попробуйте
Мы усердно работаем, чтобы быстро сделать наши мобильные приложения. Попробуйте на платформах, таких как приложения для iPhone, приложения для Android и мобильные версии HTML5, чтобы сообщить нам, как у нас дела.