Bun یا Node.js؛ سرعت بیشتر با حفره‌های سازگاری معاوضه می‌شود

|نویسنده: تیم تحریریه QUASA|6 دقیقه مطالعه| 1
Bun یا Node.js؛ سرعت بیشتر با حفره‌های سازگاری معاوضه می‌شود

برای پروژهٔ موجود، Bun می‌تواند در مسیرهای سبک وب از Node.js سریع‌تر باشد، اما جایگزینی امن و خودکار برای هر برنامه نیست. سود مهاجرت وقتی واقعی است که همان کد و وابستگی‌ها روی Bun درست اجرا شوند و سرویس، اتصال امن و داده‌های پایش لازم را حفظ کند.

اگر بخش بزرگی از زمان درخواست صرف پاسخ‌دادن مستقیم به HTTP می‌شود، آزمودن Bun منطقی است. اگر انتظار برای پایگاه داده بر زمان پاسخ مسلط باشد یا برنامه به رفتار دقیق APIهای Node.js تکیه کند، مزیت سرعت کوچک‌تر می‌شود و هزینهٔ تغییر می‌تواند از آن بیشتر باشد. ملاک، عملکرد همان برنامه در بار و معماری خودش است.

اجرای یک برنامهٔ یکسان چه چیزی را نشان می‌دهد؟

در آزمایش سازندگان Nifra، کد، مسیرها و اعتبارسنجی برنامه روی Node 26 و Bun 1.3 یکسان ماند؛ با ۵۰ اتصال هم‌زمان، مسیر سبک GET در Bun حدود ۱٫۸ برابر، POST همراه با اعتبارسنجی حدود ۱٫۶ برابر و رندر سمت سرور React حدود ۱٫۲ برابر درخواست بیشتری در ثانیه پاسخ داد. این ارقام به همان برنامه، چارچوب و تنظیمات تعلق دارند.

تفاوت میان مسیرها برای پروژهٔ موجود از یک نسبت سرعت کلی مفیدتر است. در پاسخ سبک، سهم دریافت و ارسال درخواست بیشتر است؛ در رندر صفحه، کار جاوااسکریپت برنامه سهم بیشتری از زمان می‌گیرد. در مسیر وابسته به Postgres، فاصلهٔ دو محیط تقریباً ناپدید شد، زیرا انتظار برای پایگاه داده بر زمان پاسخ غلبه داشت. پس سرعت مسیر سبک HTTP را نمی‌توان به صفحهٔ رندرشده یا مسیر دارای کوئری تعمیم داد.

کدام APIهای ظاهراً موجود دردسرساز می‌شوند؟

فهرست رسمی سازگاری Bun نشان می‌دهد وجود یک ماژول Node.js لزوماً به معنی رفتار کامل آن نیست: در node:perf_hooks، تابع eventLoopUtilization() همیشه صفر برمی‌گرداند و PerformanceObserver رویدادهای gc، dns و resource را تولید نمی‌کند. اگر هشدار سلامت سرویس از همین داده‌ها ساخته شود، برنامه ممکن است همچنان پاسخ بدهد، اما نشانهٔ اشباع یا توقف را درست نشان ندهد.

در node:async_hooks نیز createHook و شناسه‌های اجرای ناهمگام ناقص‌اند؛ شناسه‌ها صفر می‌مانند و زمینهٔ AsyncLocalStorage به رویدادهای Worker، MessagePort و BroadcastChannel منتقل نمی‌شود. بسته‌ای که برای ردیابی درخواست یا نگه‌داشتن زمینهٔ تراکنش به این رفتار متکی است، با نصب موفق و عبور از یک درخواست ساده تأیید نمی‌شود. مسئله در داده‌ای ظاهر می‌شود که باید میان کارهای ناهمگام منتقل شود.

برای اتصال امن، node:tls در Bun از OCSP stapling و برخی رویدادهای نشست پشتیبانی نمی‌کند و کلیدهای session ticket را نادیده می‌گیرد؛ در نتیجه ازسرگیری نشست میان فرایندها کار نمی‌کند. اهمیت این محدودیت به محل خاتمهٔ TLS بستگی دارد. اگر برنامه خودش اتصال ورودی را مدیریت کند، اثر آن مستقیم است؛ اگر پراکسی این کار را انجام دهد، اتصال‌های خروجی و بسته‌هایی که مستقیم node:tls را فراخوانی می‌کنند همچنان باید بررسی شوند.

در node:v8، گرفتن برخی آمار و snapshot حافظه ممکن است، ولی startCpuProfile و startHeapProfile پیاده‌سازی نشده‌اند و serialize و deserialize از قالب JavaScriptCore استفاده می‌کنند. بنابراین ابزار وابسته به این APIها یا مصرف‌کنندهٔ دادهٔ سریال‌شدهٔ V8 ممکن است خروجی مورد انتظار را نگیرد. در عین حال، راهنمای پروفایل‌گیری Bun پرچم‌های --cpu-prof و --heap-prof را برای تولید پروفایل پردازنده و snapshot حافظه توضیح می‌دهد. زنجیرهٔ پایش موجود ممکن است به تغییر ابزار یا قالب خروجی نیاز داشته باشد.

بار بیشتر چه اثری بر سرعت و منابع دارد؟

در پژوهش دانشگاه فدرال پرنامبوکو با Bun 1 و Node.js 21.6.1، برنامه‌هایی با مسیر پاسخ ساده، محاسبهٔ Fibonacci و درج در SQLite درون‌حافظه‌ای آزمایش شدند؛ Bun و Deno در بیشتر سناریوها از Node.js سریع‌تر بودند، اما با افزایش اتصال‌های هم‌زمان، فاصلهٔ عملکرد کمتر شد و Bun به‌ویژه در مسیر درج داده مصرف CPU و حافظهٔ بیشتری نشان داد. سناریوهای پژوهش محدود به همین پیاده‌سازی‌ها و بارها هستند؛ نتیجه را نباید به هر پایگاه داده یا نسخهٔ تازه‌تر نسبت داد.

مسیر SQLite درون‌حافظه‌ای این پژوهش و مسیر وابسته به Postgres در آزمایش Nifra گلوگاه یکسانی ندارند. عملیات درون‌حافظه‌ای می‌تواند سهم بیشتری از پردازش برنامه را در زمان پاسخ نگه دارد، در حالی که مسیر Postgres ممکن است عمدتاً منتظر پاسخ پایگاه داده باشد. نوع پایگاه داده و شیوهٔ اتصال در تفسیر نسبت سرعت نقش دارد.

تعداد درخواست در ثانیه فقط بخشی از ظرفیت است. مصرف حافظه تعیین می‌کند چند فرایند را می‌توان روی یک میزبان نگه داشت؛ مصرف CPU و تأخیر در شلوغی هم بر هزینه و تجربهٔ کاربر اثر می‌گذارند. اگر هدف مهاجرت کاهش هزینه یا افزایش ظرفیت است، باید این معیارها کنار نرخ پاسخ و برای ترکیب واقعی مسیرها سنجیده شوند. میانگین کلی می‌تواند افت یک مسیر حیاتی را زیر بهبود چند مسیر سبک پنهان کند.

پیش از مهاجرت چه آزمونی لازم است؟

آزمون مهاجرت با همان نسخهٔ برنامه و وابستگی‌ها روی هر دو محیط آغاز می‌شود. تغییر هم‌زمان چارچوب، کتابخانهٔ پایگاه داده یا منطق اعتبارسنجی سهم محیط اجرا را مبهم می‌کند. معیار قبولی فقط بالا آمدن سرویس نیست؛ پاسخ درست، خطا، قطع اتصال، درخواست‌های هم‌زمان و کیفیت داده‌های عملیاتی نیز جزو رفتار برنامه‌اند.

  1. وابستگی‌های مستقیم و غیرمستقیم را با توجه به استفاده از node:async_hooks، node:perf_hooks، node:tls و node:v8 جدا کنید. هر بسته‌ای که به افزونهٔ بومی یا رفتار داخلی Node.js وابسته است، باید با مسیر واقعی برنامه آزموده شود؛ موفقیت نصب، سازگاری رفتاری را نشان نمی‌دهد.
  2. محل خاتمهٔ TLS را مشخص کنید و اتصال اولیه، اتصال مجدد، گواهی‌ها و نشست را در همان آرایش استقرار بررسی کنید. این مرحله روشن می‌کند محدودیت API در مسیر ورودی اثر دارد یا در اتصال‌های خروجی برنامه.
  3. پایش و عیب‌یابی را با بار آزمایشی و یک کندی قابل تشخیص امتحان کنید. اگر هشدار به eventLoopUtilization() متکی است، صفر بودن خروجی را سلامت سرویس تعبیر نکنید؛ همچنین ببینید پروفایل و snapshot جدید با ابزار تحلیل فعلی قابل استفاده‌اند یا خیر.
  4. مسیرهای سبک، رندر، کار پردازشی و درخواست‌های وابسته به پایگاه داده را با سهم ترافیک خودشان و در چند سطح بار اجرا کنید. نرخ پاسخ، تأخیر، CPU و حافظه را با هم ثبت کنید تا سود یک مسیر زیر هزینهٔ مسیر دیگر پنهان نماند.

برای کدام پروژه جابه‌جایی می‌ارزد؟

Bun بیشتر به کار سرویسی می‌آید که بخش مهمی از ترافیکش از مسیرهای سبک می‌گذرد، وابستگی‌هایش در اجرای واقعی روی آن رفتار درست دارند و پایش لازم را می‌توان حفظ کرد. در این وضعیت، انتقال محدود همان سرویس تصمیمی قابل سنجش است. برای برنامه‌ای که به نشست TLS میان فرایندها، داده‌های خاص perf_hooks یا ابزارهای متکی بر قالب V8 نیاز دارد، ابتدا باید جایگزین آن رفتارها آماده و آزموده شود.

بیشتر بخوانید:

اشتراک‌گذاری:

عضویت در خبرنامه

تازه‌ترین اخبار Web3، هوش مصنوعی و رمزارز را مستقیم در صندوق ایمیل خود دریافت کنید.

0