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/
نتایج را در زیر مشاهده کنید
خروجی را می توان به اجزای زیر تقسیم کرد:
- کاربر 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/
نتایج را در زیر مشاهده کنید،
- CPU صرف اجرای کد: 0.00 ثانیه
- زمان صرف شده برای اجرای کد سیستم: 0.01 ثانیه
- درصد استفاده از CPU برای اجرای کد: 51%
- زمان صرف شده برای اجرای کد: 0.020
واضح تر و واضح تر است که کدام سرور بهینه تر است.
توجه به این نکته مهم است که بهینه سازی عملکرد برنامه Node.js یک فرآیند مداوم است که نیاز به نظارت و اصلاح مداوم دارد. با اجرای این تکنیک ها، می توانید عملکرد اپلیکیشن خود را به میزان قابل توجهی بهبود بخشید و اطمینان حاصل کنید که نیازهای کاربران شما را برآورده می کند. با بهینه سازی مناسب، برنامه Node.js شما می تواند حجم ترافیک بالایی را مدیریت کند و یک تجربه کاربری یکپارچه ارائه دهد، که برای موفقیت هر کسب و کار یا برنامه آنلاین بسیار مهم است.
اگر از این مقاله لذت بردید، حتماً مقالات دیگر من در Node.js را بررسی کنید.