برنامه نویسی

3 روش برای بهینه سازی عملکرد برنامه Node.js

Node.js یک محیط اجرای محبوب برای ساخت برنامه های وب سریع، مقیاس پذیر و کارآمد است. با این حال، حتی با وجود نقاط قوت ذاتی، برنامه‌های Node.js بهینه‌شده ضعیف می‌توانند از گلوگاه‌های عملکردی رنج ببرند که در نتیجه زمان بارگذاری کند، سرورها پاسخگو نیستند و هزینه‌های عملیاتی افزایش می‌یابد. برای به حداکثر رساندن پتانسیل برنامه Node.js و اطمینان از اینکه می تواند سطوح بالای ترافیک را بدون تزلزل مدیریت کند، بهینه سازی عملکرد آن ضروری است. در این آموزش، چند تکنیک موثر برای بهینه‌سازی عملکرد برنامه Node.js، از تجزیه و تحلیل معیارهای عملکرد گرفته تا اجرای استراتژی‌های کش و استفاده از بهترین روش‌ها را بررسی می‌کنیم. در پایان این آموزش، درک جامعی از نحوه بهبود عملکرد برنامه Node.js و ارائه یک تجربه کاربری برتر خواهید داشت.

پیش نیازها

آموزش

برنامه Node.js ما اینجاست – https://github.com/pavanbelagatti/Simple-Node-App

می توانی ببینی app.js در ریشه مخزن برنامه،

const express = require('express');

const app = express();
const PORT = process.env.PORT || 3002;

app.get("https://dev.to/", (request, response) => {
  response.status(200).json({
    message: 'Hello Docker!',
  });
});

app.listen(PORT, () => {
  console.log(`Server is up on localhost:${PORT}`);
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از دستور زیر می توانید برنامه را اجرا کنید

node app.js
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حال بیایید در مورد بهینه سازی عملکرد این اپلیکیشن صحبت کنیم.
در اینجا چند تکنیک وجود دارد که می توانید از آنها استفاده کنید:

ذخیره سازی:

ذخیره سازی در حافظه پنهان می تواند به کاهش مدت زمان پاسخگویی برنامه شما به درخواست ها کمک کند. در Node.js می توانید از node-cache بسته برای پیاده سازی کش

از کد ناهمزمان استفاده کنید:

در Node.js، کد ناهمزمان می تواند به بهبود عملکرد برنامه شما کمک کند.

استفاده از ماژول کلاستر:

ماژول کلاستر می تواند به بهبود عملکرد برنامه Node.js شما کمک کند و به آن اجازه می دهد روی چندین هسته اجرا شود.

اضافه کنیم ذخیره سازی، کد ناهمزمان و ماژول خوشه تکنیک هایی برای بهبود عملکرد برنامه Node.js ما.

در اینجا به روز شده است app.js فایل

const express = require('express');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const NodeCache = require( "node-cache" );

const app = express();
const cache = new NodeCache();
const PORT = process.env.PORT || 3002;

// Define a function to handle the request
const handleRequest = (request, response) => {
  // Check if the request is already cached
  const key = request.url;
  const cachedResponse = cache.get(key);
  if (cachedResponse) {
    // If the response is cached, return it
    console.log(`Serving from cache: ${key}`);
    return response.status(200).json(cachedResponse);
  }

  // If the response is not cached, perform the operation asynchronously
  console.log(`Processing request: ${key}`);
  setTimeout(() => {
    const responseData = {
      message: 'Hello Docker!',
    };
    cache.set(key, responseData);
    console.log(`Caching response: ${key}`);
    return response.status(200).json(responseData);
  }, 1000);
};

// Use clustering to take advantage of multiple CPU cores
if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  // Listen for worker exit events
  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  // Set up the server
  app.get("https://dev.to/", handleRequest);

  app.listen(PORT, () => {
    console.log(`Worker ${process.pid} is up on localhost:${PORT}`);
  });
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وابستگی گره به کش وجود ندارد. با استفاده از دستور زیر آن را اضافه کنید

npm install node-cache
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با همین دستور می توانید برنامه را اجرا کنید

node app.js
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما چیزی متوجه نخواهید شد زیرا ما هنوز باید بررسی کنیم که چگونه عملکرد در سرور به روز شده بهبود یافته است.

کد بالا شامل بهینه سازی های زیر است:

  • ذخیره سازی با استفاده از ماژول node-cache: ما یک نمونه جدید از node-cache ایجاد می کنیم و از آن برای ذخیره پاسخ ها برای هر URL درخواست استفاده می کنیم. هنگامی که یک درخواست جدید وارد می شود، ابتدا بررسی می کنیم که آیا پاسخ قبلاً ذخیره شده است یا خیر. اگر اینطور باشد، به جای ایجاد پاسخ جدید، پاسخ ذخیره شده را برمی گردانیم.

  • کد ناهمزمان: ما از تابع setTimeout برای شبیه سازی یک عملیات ناهمزمان استفاده می کنیم که تکمیل آن 1 ثانیه طول می کشد. این به سرور اجازه می دهد تا در حین اجرای عملیات ناهمزمان به پردازش درخواست ها ادامه دهد.

  • ماژول خوشه: ما از ماژول کلاستر برای ایجاد یک فرآیند کارگر برای هر هسته CPU استفاده می کنیم. این به سرور اجازه می دهد تا چندین درخواست را به طور همزمان انجام دهد و از تمام هسته های CPU موجود استفاده کند.

بیایید عملکرد سرور قدیمی در مقابل بهینه سازی شده را آزمایش کنیم.

برای تست عملکرد سرورهای تحت بار، می توانید از ابزار تست بار مانند Apache JMeter یا Siege استفاده کنید. این ابزارها به شما این امکان را می‌دهند که تعداد زیادی از کاربران همزمان درخواست‌هایی را به سرور خود شبیه‌سازی کنید و زمان پاسخ، توان عملیاتی و سایر معیارهای عملکرد را اندازه‌گیری کنید.

در اینجا مثالی از نحوه استفاده از Siege برای آزمایش عملکرد سرورهای خود آورده شده است:
Siege را نصب کنید: می توانید Siege را با استفاده از دستور زیر در سیستم های مبتنی بر یونیکس نصب کنید:

sudo apt-get install siege
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و برای MAC می توانید از دستور زیر برای نصب Siege استفاده کنید.

brew install siege
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که Siege نصب شد، می توانید دستور زیر را برای شبیه سازی 100 کاربر همزمان که 1000 درخواست به سرور شما ارسال می کنند، اجرا کنید:

siege -c 100 -r 1000 http://localhost:3002/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قبل از این، با استفاده از دستور زیر مطمئن شوید که سرور شما روشن است.

node app.js
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس دستور Curl را برای اندازه گیری زمان پاسخ اجرا کنید

time curl http://localhost:3002/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتایج را در زیر مشاهده کنید
3002 محلی

خروجی را می توان به اجزای زیر تقسیم کرد:

  • کاربر 0.00s: این مقدار زمانی است که CPU برای اجرای کد کاربر صرف کرده است (یعنی زمانی که برای اجرای کد جاوا اسکریپت شما صرف شده است).
  • سیستم 0.00s: این مقدار زمانی است که CPU برای اجرای کد سیستم صرف کرده است (یعنی زمان صرف شده برای اجرای کد در سیستم عامل یا سایر کدهای سطح سیستم).
  • سی پی یو 39 درصد: این درصد استفاده از CPU در طول اجرای کد است.
  • 0.018 کل: این کل زمانی است که برای اجرای کد صرف شده است (یعنی زمان کاربر + زمان سیستم).

حالا بیایید عملکرد را با سرور قدیمی مقایسه کنیم.
همین روش را دنبال کنید، فقط مطمئن شوید که سرور قدیمی شما (app.js) روی پورت 3001 محلی شما برای این آزمایش اجرا می شود.

برنامه را اجرا کنید

node app.js
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بار را با Siege اضافه کنید

siege -c 100 -r 1000 http://localhost:3001/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس دستور Curl را برای اندازه گیری زمان پاسخ اجرا کنید

time curl http://localhost:3001/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتایج را در زیر مشاهده کنید،
3001 محلی

  • CPU صرف اجرای کد: 0.00 ثانیه
  • زمان صرف شده برای اجرای کد سیستم: 0.01 ثانیه
  • درصد استفاده از CPU برای اجرای کد: 51%
  • زمان صرف شده برای اجرای کد: 0.020

واضح تر و واضح تر است که کدام سرور بهینه تر است.

توجه به این نکته مهم است که بهینه سازی عملکرد برنامه Node.js یک فرآیند مداوم است که نیاز به نظارت و اصلاح مداوم دارد. با اجرای این تکنیک ها، می توانید عملکرد اپلیکیشن خود را به میزان قابل توجهی بهبود بخشید و اطمینان حاصل کنید که نیازهای کاربران شما را برآورده می کند. با بهینه سازی مناسب، برنامه Node.js شما می تواند حجم ترافیک بالایی را مدیریت کند و یک تجربه کاربری یکپارچه ارائه دهد، که برای موفقیت هر کسب و کار یا برنامه آنلاین بسیار مهم است.

اگر از این مقاله لذت بردید، حتماً مقالات دیگر من در Node.js را بررسی کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا