برنامه نویسی

تست های محک زدن در 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

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

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

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

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