تست های محک زدن در Node.js API: راهنمای جامع

درک ویژگی های عملکرد Node.js API شما نیاز به بنچمارک دارد. این به شناسایی تنگناها، بهینه سازی کد و اطمینان از اینکه API شما می تواند ترافیک لازم را مدیریت کند کمک می کند. این پست در مورد تست های بنچمارک در یک Node.js API، از جمله روش های ساده و پیچیده با مثال های دنیای واقعی بحث می کند.
🤨 چرا تعیین معیار مهم است
قبل از پرداختن به پیاده سازی، بسیار مهم است که بدانیم چرا معیارگذاری بسیار ارزشمند است:
↳ بهینه سازی عملکرد: محک زدن به شما کمک می کند نقاط پایانی کند یا عملکردهایی را که نیاز به بهینه سازی دارند شناسایی کنید.
↳ تست مقیاسپذیری: به شما امکان میدهد ببینید که API شما چگونه بارهای مختلف را مدیریت میکند تا مطمئن شوید که مقیاس مناسبی دارد.
↳ استقرار خط پایه: یک خط پایه عملکرد به شما می دهد تا بسنجید که چگونه بهبود زیرساخت یا اصلاح کد روی چیزها تأثیر می گذارد.
↳ بهبود تجربه کاربری: میتوانید با شناسایی و رفع مشکلات عملکرد، یک API سریعتر و پاسخگوتر در اختیار کاربران خود قرار دهید.
🏎️ راه اندازی یک API پایه Node.js برای بنچمارک
برای شروع، اجازه دهید یک Node.js API ساده راه اندازی کنیم که از آن برای تست های بنچمارک خود استفاده می کنیم.
مرحله 1: یک API Simple Express ایجاد کنید
ابتدا یک پروژه Node.js جدید ایجاد کنید و Express را نصب کنید:
mkdir nodejs-benchmarking
cd nodejs-benchmarking
npm init -y
npm install express
در مرحله بعد، یک فایل index.js با یک سرور اصلی Express ایجاد کنید:
const express = require('express');
const app = express();
app.get('/fast-endpoint', (req, res) => {
res.send('This is a fast endpoint!');
});
app.get('/slow-endpoint', (req, res) => {
setTimeout(() => {
res.send('This is a slow endpoint!');
}, 500);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
در این مثال، ما دو نقطه پایانی داریم: /fast-endpoint و /slow-endpoint. نقطه پایان آهسته / با معرفی یک تاخیر 500 میلیثانیه، پاسخ آهسته را شبیهسازی میکند.
🚀 محک زدن با اتوکانن
یکی از محبوب ترین ابزارها برای بنچمارک کردن API های Node.js، autocannon است. این سریع، آسان برای استفاده است و می تواند تعداد زیادی از درخواست های همزمان را مدیریت کند.
مرحله 2: نصب autocannon
شما می توانید autocannon را به صورت جهانی یا به عنوان یک وابستگی توسعه نصب کنید:
npm install -g autocannon
مرحله 3: اجرای تست معیار
برای اجرای یک تست بنچمارک در برابر API ما، از دستور زیر استفاده کنید:
autocannon -d 10 -c 50 http://localhost:3000/fast-endpoint
-d 10: Duration of the test in seconds.
-c 50: Number of concurrent connections.
این دستور 50 درخواست همزمان را به مدت 10 ثانیه به /fast-endpoint ارسال می کند.
مرحله 4: تجزیه و تحلیل نتایج
نتایج حاصل از autocannon چیزی شبیه به این خواهد بود:
Running 10s test @ http://localhost:3000/fast-endpoint
50 connections
Stat Avg Stdev Max
Latency (ms) 5.32 3.02 47
Req/Sec 9221 187.5 9499
Bytes/Sec 1.79 MB 38.5 kB
90194 requests in 10.02s, 17.9 MB read
Latency: The time taken for a request to be processed.
Req/Sec: The number of requests processed per second.
Bytes/Sec: The amount of data transferred per second.
از این معیارها، میتوانید ببینید که API شما تحت بارگذاری چقدر خوب عمل میکند و مناطقی را که نیاز به بهبود دارند شناسایی کنید.
📈 محک گذاری پیشرفته با wrk
برای معیارهای پیشرفته تر، ممکن است بخواهید از wrk استفاده کنید، ابزاری مدرن برای محک زدن HTTP که انعطاف و کنترل بیشتری بر روی تست های شما فراهم می کند.
مرحله 5: wrk را نصب کنید
می توانید wrk را با استفاده از Homebrew در macOS نصب کنید:
brew install work
مرحله 6: اجرای یک معیار با wrk
در اینجا نحوه اجرای یک معیار ساده با wrk آمده است:
wrk -t12 -c400 -d30s http://localhost:3000/slow-endpoint
-t12: Number of threads to use.
-c400: Number of open connections.
-d30s: Duration of the test.
مرحله 7: تفسیر نتایج wrk
خروجی wrk آمار دقیقی در مورد تأخیر درخواست، توان عملیاتی و موارد دیگر در اختیار شما قرار می دهد:
Running 30s test @ http://localhost:3000/slow-endpoint
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 44.32ms 13.22ms 88.95ms 55.12%
Req/Sec 758.66 32.37 83.25 73.41%
227547 requests in 30.02s, 22.47MB read
Requests/sec: 7582.03
Transfer/sec: 788.93KB
این خروجی به شما دید جامع تری از عملکرد API خود در شرایط بار سنگین تر می دهد.
✅ بهینه سازی Node.js API بر اساس نتایج محک زدن
پس از اجرای معیارهای خود، ممکن است گلوگاه های عملکرد خاصی را شناسایی کنید. در اینجا چند استراتژی متداول برای بهینه سازی Node.js API آورده شده است:
1. از Caching استفاده کنید
برای کاهش بار روی سرور خود، ذخیره سازی را برای داده های درخواستی مکرر اجرا کنید.
مثال: ذخیره سازی با گره کش
const NodeCache = require('node-cache');
const myCache = new NodeCache();
app.get('/cached-endpoint', (req, res) => {
const cachedData = myCache.get('key');
if (cachedData) {
return res.send(cachedData);
}
const data = "Expensive Operation Result";
myCache.set('key', data, 60); // Cache for 60 seconds
res.send(data);
});
2. کوئری های پایگاه داده را بهینه کنید
پرس و جوهای پایگاه داده می توانند منبع مهمی از تأخیر باشند. پرس و جوهای خود را با نمایه سازی، اجتناب از پرس و جوهای N+1 و استفاده از ادغام اتصال بهینه کنید.
مثال: بهینه سازی پرس و جو پایگاه داده
app.get('/optimized-query', async (req, res) => {
const users = await db.query('SELECT * FROM users WHERE active = true LIMIT 100');
res.send(users);
});
3. سربار میان افزار را کاهش دهید
پشته میانافزار خود را بررسی کنید و مطمئن شوید که فقط میانافزار ضروری برای هر مسیر اعمال میشود.
مثال: برنامه میان افزار انتخابی
const authenticate = require('./middleware/authenticate');
app.get('/protected-endpoint', authenticate, (req, res) => {
res.send('This is a protected endpoint!');
});
app.get('/public-endpoint', (req, res) => {
res.send('This is a public endpoint!');
});
4. از برنامه نویسی ناهمزمان استفاده کنید
با استفاده از تکنیک های برنامه نویسی ناهمزمان مانند async/await از مدل I/O غیر مسدود کننده Node.js استفاده کنید.
مثال: مدیریت مسیر ناهمزمان
app.get('/async-endpoint', async (req, res) => {
try {
const data = await someAsyncFunction();
res.send(data);
} catch (err) {
res.status(500).send('Something went wrong!');
}
});
یک گام مهم برای اطمینان از اینکه Node.js API شما تحت بارهای مختلف به بهترین شکل عمل می کند، معیارسنجی است. با استفاده از ابزارهایی مانند autocannon و wrk میتوانید زمینههایی برای بهبود پیدا کنید و بینش مفیدی در مورد عملکرد API خود به دست آورید. با اجرای بهینهسازیهایی مانند حافظه پنهان، بهینهسازی پرس و جو پایگاه داده، کاهش سربار میانافزار و برنامهنویسی ناهمزمان پس از محکگذاری API، میتوان به ساخت اپلیکیشنهای سریعتر و مقیاسپذیرتر دست یافت.
برای اطمینان از اینکه Node.js API شما میتواند به خوبی تقاضاها و مقیاسهای کاربر را با رشد برنامهتان برطرف کند، فوراً آن را محک بزنید.
مرجع:
https://assets.toptal.io/images?url=https%3A%2F%2Fbs-uploads.toptal.io%2Fblackfish-uploads%2Fcomponents%2Fblog_post_page%2F4085508%2Fcover_image%2Fregular_1708F%cures-68set in-nodejs-360b1ec113164955f21196433cb1e125.png