چگونه کلودفلر با استفاده از V8 میلیاردها دلار صرفه‌جویی می‌کند

کلودفلر یکی از محبوب‌ترین CDNهای جهان است، البته معروفیت شرکت در چندسال اخیر بیشتر مدیون ارائه Serverless Computing یا پردازش بدون سرور که ما آن را با نام Cloudflare Workers می‌شناسیم است. نکته مهم اینکه ما میدانیم اجرای یک کد نیازمند کامپیوتر میزبان است پس با این وجود چطور ممکن است کلودفلر بتواند هزینه‌های میلیارد دلاری خود را مدیریت کند و این سرویس را رایگان در اختیار عموم کاربران قرار دهد؟ در این مقاله با هم به دنبال پاسخ این سوال خواهیم بود.

·۷ دقیقه برای خواندن
چگونه کلودفلر با استفاده از V8 میلیاردها دلار صرفه‌جویی می‌کند

ویژگی‌های Cloudflare Workers

کلودفلر ورکرز (Cloudflare Workers) یک پلتفرم بدون سرور (Serverless) است که کد شما را مستقیماً روی شبکه جهانی Cloudflare اجرا می‌کند. در ادامه چهار ویژگی مهم آن را بررسی می‌کنیم:

معماری بدون سرور و مقیاس‌پذیری خودکار

این پلتفرم نیازی به مدیریت زیرساخت، سرور یا تنظیمات پیچیده مقیاس‌پذیری ندارد. با افزایش ترافیک، به‌صورت خودکار منابع لازم فراهم می‌شود و شما فقط برای زمان اجرای واقعی کد (CPU Time) هزینه می‌پردازید، نه برای سرورهای بیکار. البته شما تا ۱۰۰,۰۰۰ ریکوئست در روز را در پلن رایگان دارید که میتواند برای کسب و کارهای کوچک و متوسط کاملا کافی باشد.

عملکرد بالا با شروع سرد تقریباً صفر

برخلاف بسیاری از سرویس‌های ابری که از کانتینر استفاده می‌کنند، Workers بر پایه V8 Isolates (همان فناوری مرورگر کروم) اجرا می‌شود. این معماری زمان راه‌اندازی (Cold Start) را به کمتر از ۵ میلی‌ثانیه می‌رساند و به‌طور چشمگیری تأخیر پاسخ‌دهی را کاهش می‌دهد.

شبکه جهانی توزیع‌شده

کد شما به‌طور خودکار روی بیش از ۳۳۵ دیتاسنتر در سراسر جهان مستقر می‌شود. این یعنی برنامه‌ها و APIها از نزدیک‌ترین نقطه به کاربر نهایی اجرا می‌شوند و تجربه‌ای سریع و پایدار را در هر نقطه از جهان فراهم می‌کنند.

اکوسیستم یکپارچه و چندزبانه

سرویس Workers از زبان‌های مختلفی مانند JavaScript، TypeScript، Python و Rust پشتیبانی می‌کند و با سایر سرویس‌های Cloudflare مثل KV (ذخیره‌سازی کلید-مقدار)، R2 (ذخیره‌سازی شیء)، D1 (دیتابیس SQL) و Workers AI یکپارچه می‌شود. همچنین ابزارهای داخلی برای مشاهده‌پذیری (Logs و Analytics) در اختیار شما قرار می‌گیرد.

ابتدا بیاید نگاهی به رقبای کلودفر داشته باشیم و ببینیم آنها قابلیت‌های مشابه را چگونه مدیریت می‌کنند. کلودفلر چگونه با حفظ همان عملکرد AWS Lambda و حتی پیشی گرفتن از عملکرد Lambda و سایر سرویس‌های ابری مانند Azure، راهی انقلابی برای صرفه‌جویی میلیاردها دلار در زیرساخت به کار برده است.

سرویس AWS Lambda

از یک ماشین مجازی لینوکس برای جداسازی کد استفاده می‌کند؛ این ماشین مجازی کوچک لینوکس Firecracker نامیده می‌شود. برای هر نمونه کد AWS Lambda از ۵ تا ۱۰ مگابایت RAM مصرف می‌شود؛ این ماشین مجازی کوچک روی فراخوانی‌های سیستمی ماشین مهمان اجرا می‌شود.

به‌طور خلاصه، برای هر درخواست Lambda، AWS باید چنین کانتینری را برای اجرای امن کد ایجاد کند.

سرویس Azure Functions

در Azure دو نوع جداسازی وجود دارد:

  • جداسازی در سطح فرآیند: سنگین نیست؛ از فرآیند w3wp.exe استفاده می‌کند و برای APIهای سبک‌وزن به کار می‌رود.
  • جداسازی در سطح کانتینر: در اینجا Azure همان استراتژی AWS را به کار می‌برد و از ماشین مجازی کوچک استفاده می‌کند؛ برای اجرای کدهای حیاتی به کار می‌رود و به ۵ تا ۲۰ مگابایت RAM به ازای هر نمونه نیاز دارد.

راه‌حل کلودفلر برای صرفه‌جویی در هزینه‌ها

ماشین‌های مجازی کوچک برای شرکت‌ها گران تمام می‌شوند؛ RAM و CPU آن‌ها پرهزینه است. هر شرکتی که بخواهد رایانش بدون سرور ارائه دهد، برای اجرای کد به‌صورت منزوی به سرورهای بیشتری نیاز خواهد داشت.

کلودفلر از سرورهای PoP استفاده می‌کند؛ و از طرفی منابع مالی مایکروسافت یا آمازون هم در اختیار کلودفر نیست پس آنها یک ایده انقلابی را مطرح کردند. استفاده از موتور V8 برای اجرای کد

خیلی خلاصه V8 چیست؟

یک موتور متن‌باز و با عملکرد خوب برای جاوااسکریپت و WebAssembly است که توسط گوگل توسعه یافته است. این موتور به زبان ‍‍++C نوشته شده و جاوااسکریپت را پیش از اجرا مستقیماً به کد ماشین بومی کامپایل می‌کند، که آن را بسیار سریع می‌سازد.

این موتور در گوگل کروم و محیط‌های اجرای سمت سرور مانند Node.js، Deno و Cloudflare Workers به کار می‌رود.

تیم کلودفلر این‌گونه فکر می‌کند: «وقتی یک تب جدید در کروم باز می‌کنید، برای هر تب یک VM ایجاد نمی‌شود، بلکه جداسازی‌های سبک‌وزن (Isolates) ایجاد می‌شوند.»

استاد جداسازی

برای هر نمونه موتور V8 یک زباله‌روب (Garbage Collector) اختصاصی دارد و وقتی جاوااسکریپت را به ++C تبدیل می‌کند، مرز سخت‌گیرانه‌ای فراهم می‌آورد که هیچ توسعه‌دهنده‌ای نتواند به هر شکلی به آن کد دسترسی پیدا کند؛ این ساختار برای کلودفلر بی‌نقص بود.

قبل‌تر Node.js در میان توسعه‌دهندگان محبوب بود، بنابراین کلودفلر شروع به کار روی این ایده کرد، اما چالش‌هایی وجود داشت؛ آن‌ها نمی‌توانستند V8 را همان‌طور که هست استفاده کنند. V8 باید از یک موتور مرورگر به یک موتور بدون سرور لبه‌ای (Edge Serverless Engine) تبدیل می‌شد.

کلودفلر چالش‌های زیادی داشت: در کروم، V8 وقتی کاربران یک تب را می‌بندند حافظه را پاک می‌کند، اما در رایانش لبه‌ای، میلیون‌ها Worker ممکن است اجرا و نابود شوند. یک زباله‌روب تهاجمی ممکن است به ۱۰۰ درصد استفاده از CPU نیاز داشته باشد؛ این باید اصلاح می‌شد.

چالش دیگر این بود که کلودفلر پلن‌های Worker ارائه می‌دهد؛ هر پلن زمان CPU متفاوتی دارد و V8 توانایی شمارش مصرف CPU را نداشت. برای غلبه بر این مشکل، کلودفلر استراتژی زیر را به کار می‌برد:

۱. وقتی درخواستی می‌رسد، V8 Isolate شروع به اجرای جاوااسکریپت کاربر روی Main Worker Thread می‌کند. در همان میلی‌ثانیه، فرآیند میزبان ++C یک تایمر مخصوص THREAD را با استفاده از سیگنال‌های POSIX لینوکس (timer_create با CLOCK_THREAD_CPUTIME_ID) ثبت می‌کند.

جزئیات حیاتی: CLOCK_THREAD_CPUTIME_ID چرخه‌های CPU فعالی را که آن نخ خاص مصرف می‌کند ردیابی می‌کند و زمان صرف‌شده برای انتظار I/O شبکه یا پاسخ‌های ناهمگام را نادیده می‌گیرد.

۲. پایش ناهمگام
در حالی که Main Worker Thread جاوااسکریپت را اجرا می‌کند، Watchdog Thread پس‌زمینه به رویدادهای سیگنال از هستهٔ سیستم‌عامل گوش می‌دهد.

سناریوی الف (کد عادی): کد در محدودهٔ ۱۰ تا ۵۰ میلی‌ثانیه CPU تکمیل می‌شود. تایمر لغو می‌شود و پاسخ بازگردانده می‌شود.

سناریوی ب (حلقهٔ بی‌نهایت / مصرف‌کنندهٔ CPU): کد جاوااسکریپت کل بودجهٔ CPU تخصیص‌یافتهٔ خود را مصرف می‌کند.

۳. فعال‌سازی سیگنال و کلید قطع
اگر بودجهٔ CPU منقضی شود، هستهٔ سیستم‌عامل یک سیگنال وقفه مستقیماً به Watchdog Thread ارسال می‌کند.

از آنجا که Watchdog Thread به‌صورت ناهمگام خارج از نخ اجرای V8 اجرا می‌شود، حتی اگر کد جاوااسکریپت در یک حلقهٔ while(true) بی‌نهایت گیر کرده باشد، کاملاً بدون انسداد باقی می‌ماند.

۴. خاتمهٔ ایمن
حالا Watchdog Thread متد API بومی ++C مربوط به V8 را فراخوانی می‌کند.

۱. صرفه‌جویی عظیم در سخت‌افزار سرور (چگالی فوق‌بالا)

در عملیات مراکز داده، RAM یکی از پرهزینه‌ترین منابع برای مقیاس‌پذیری است.

مدل AWS (ماشین‌های مجازی کوچک): چون AWS حداقل تخصیص ۱۲۸ مگابایت به ازای هر نمونه تابع را اجباری می‌کند، یک سرور استاندارد فلزی خام با ۶۴ گیگابایت RAM می‌تواند حداکثر حدود ۵۰۰ تا ۱۰۰۰ تابع فعال را میزبانی کند.

مدل کلودفلر (V8 Isolates): چون یک V8 Isolate فقط به حدود ۲ تا ۳ مگابایت حافظهٔ پایه نیاز دارد، همان سرور ۶۴ گیگابایتی می‌تواند به‌راحتی بیش از ۲۰٬۰۰۰ Worker فعال را میزبانی کند.

تأثیر مالی: کلودفلر به حدود ۹۰٪ سخت‌افزار فیزیکی کمتر نسبت به AWS برای اجرای همان حجم از بارهای کاری نیاز دارد. این امر هزینه‌های سرمایه‌ای (CapEx) برای سرورها، برق، خنک‌سازی و فضای رک را به‌شدت کاهش می‌دهد.

۲. استفادهٔ مجدد از زیرساخت با هزینهٔ صفر (گسترش لبه)

کلودفلر از قبل بیش از ۳۰۰ مرکز دادهٔ لبه‌ای در سراسر جهان داشت که پروکسی‌های معکوس CDN را اجرا می‌کردند.

رویکرد سنتی ماشین مجازی: برای اجرای ماشین‌های مجازی به سبک AWS Lambda در لبه، کلودفلر باید خوشه‌های سرور عظیم و گران‌قیمت را در هر شهر نصب می‌کرد.

رویکرد V8 Isolate: V8 Isolates آن‌قدر سبک‌وزن هستند که کلودفلر به‌سادگی محیط اجرای V8 (workerd) را مستقیماً روی سرورهای CDN موجود خود نصب کرد.

تأثیر مالی: آن‌ها یک شبکهٔ رایانش لبه‌ای جهانی را با هزینهٔ استقرار زیرساخت تقریباً صفر و با استفاده از سخت‌افزاری که از قبل داشتند راه‌اندازی کردند.

۳. حذف چرخه‌های محاسباتی هدررفته

در ماشین‌های مجازی کوچک سنتی، هر شروع سرد (Cold Start) چرخه‌های CPU را صرف کارهای سیستمی غیرقابل‌صورت‌حساب می‌کند:

  • مقداردهی اولیه به هستهٔ سیستم‌عامل.
  • راه‌اندازی سیستم فایل مجازی.
  • بوت کردن محیط‌های اجرای زبان (Node.js/Python).

این چرخه‌های CPU برق مصرف می‌کنند و گرما تولید می‌کنند بدون اینکه کار واقعی برای کاربر انجام دهند. در مقابل، V8 Isolates از عکس‌های حافظه از پیش آماده در کمتر از ۵ میلی‌ثانیه بوت می‌شوند. تقریباً ۱۰۰٪ توان CPU کلودفلر مستقیماً صرف اجرای کد کاربر می‌شود.

نتیجه گیری

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