Cloudflare سرویس cdnjs را به‌طور کامل به پلتفرم توسعه‌دهندگان منتقل کرد

Cloudflare پروژهٔ متن‌باز cdnjs، توزیع‌کنندهٔ کتابخانه‌های JavaScript و CSS، را از زیرساخت ترکیبی با Google Cloud به پلتفرم توسعه‌دهندگان خود منتقل کرد. این مهاجرت cdnjs از مجموعه‌ای از ابزارهای داخلی شامل Workers، R2، Workflows، Queues، Durable Objects، KV و کانتینرها برای انتشار و سرو فایل‌ها بهره می‌گیرد و آدرس‌ها، محتوای بسته‌ها و هش‌های Subresource Integrity (SRI) را بدون تغییر حفظ کرده است (MDN SRI).

مقیاس عملیاتی: 9 میلیارد درخواست در روز

نسخهٔ جدید cdnjs روزانه حدود 9,000,000,000 درخواست را سرو می‌کند، معادل میانگین حدود 108,000 درخواست بر ثانیه روی بیش از 330 مرکز دادهٔ Cloudflare. نرخ برخورد کش (cache hit rate) گزارش‌شده 98.6% است و نزدیک به 12% از وب‌سایت‌ها از این سرویس استفاده می‌کنند. Cloudflare این پروژه را مصداقی از «داگ‌فودینگ» پلتفرم توسعه‌دهندگان خود معرفی کرده؛ یعنی استفادهٔ داخلی از ابزارهایی که برای کاربران عمومی عرضه می‌شوند.

چرا مهاجرت لازم بود؟ محدودیت‌های معماری قبلی

پیش از انتقال، فرایند انتشار cdnjs پراکنده بین سرویس‌های Cloud و Google بود: توابع Google Cloud Functions به‌صورت دوره‌ای npm را بررسی می‌کردند، بسته‌ها در Google Cloud Storage نگهداری می‌شدند، Pub/Sub پیام‌رسانی را مدیریت می‌کرد و یک ماشین مجازی با git-sync مخزن GitHub را همگام‌سازی می‌نمود. آن‌زمان سیستم شامل 26 تابع Cloud Functions بود که به قطعات الفبایی تقسیم شده بودند و مخزن GitHub بیش از 1.1 ترابایت فضای ذخیره‌سازی فشرده داشت. فایل‌های منتشرشده هم در GitHub و هم در KV تکرار می‌شدند که پیچیدگی و سربار عملیاتی قابل توجهی ایجاد می‌کرد.

معماری جدید: نقش R2، KV، Workers و Workflows

در معماری تازه، R2 به‌عنوان مرجع اصلی (source of truth) فایل‌های منتشرشده تعیین شده است. KV برای ذخیرهٔ متادیتا، شمارهٔ نسخه‌ها و هش‌های SRI به کار می‌رود، یک Worker درخواست‌ها را پاسخ می‌دهد و Workers Cache لایهٔ کش را تأمین می‌کند. برای پایداری بیشتر، محتوای منتشرشده به‌صورت آینه در DigitalOcean Spaces نیز نگهداری می‌شود تا در صورت بروز اختلال در R2، فایل‌ها در دسترس باقی بمانند.

معماری جدید cdnjs با R2، Workers، KV و Workflows

خط لولهٔ انتشار و پردازش بسته‌ها

ورودی بسته‌ها اکنون توسط Workflows هماهنگ می‌شود: یک گردش‌کار زمان‌بندی‌شده npm و GitHub را برای انتشارها بررسی می‌کند، بسته‌ها را به R2 دانلود می‌کند و سپس برای هر فایل پردازش‌های لازم را اجرا می‌کند. این خط لوله فایل‌ها را استخراج، مینیفای و فشرده‌سازی می‌کند، خروجی را در R2 قرار می‌دهد، متادیتا را در KV به‌روزرسانی می‌کند و شاخص جستجو را در Algolia تازه می‌سازد. گردش‌کار به‌گونه‌ای طراحی شده که در صورت بروز خطا پردازش از آخرین مرحلهٔ کامل‌شده ادامه یابد تا بازیابی سریع‌تر ممکن شود.

فشرده‌سازی و نقش کانتینرها

الگوریتم‌های فشرده‌سازی کنونی نیاز به بافر کامل یک کتابخانه در حافظه دارند؛ از این رو عملیات فشرده‌سازی در کانتینرها اجرا می‌شود تا محدودیت حافظهٔ Workers دور زده شود. تیم توسعه در حال تحقیق روی پشتیبانی از جریان‌پردازی (streaming) است که در صورت پیاده‌سازی ممکن است اجازه دهد پردازش مستقیم در داخل Workers انجام شود و نیاز به کانتینرها کاهش یابد. برای اطلاعات عمومی دربارهٔ Brotli و gzip می‌توانید به معرفی Brotli مراجعه کنید.

حفظ ثبات فنی: نگهداری بایت‌ها و هش‌های SRI

حفظ دقیق بایت‌های منتشرشده حیاتی بود، چون هر تغییر در فرایند مینیفیکیشن یا فشرده‌سازی می‌توانست هش‌های SRI را تغییر دهد و یکپارچگی محتوای منتشرشده را مختل کند. به همین دلیل تیم مهاجرت مکانیزم‌هایی پیاده‌سازی کرد که محتوا را بایت‌به‌بایت منتقل کنند و در عین حال همان URLها حفظ شوند.

محدودیت‌های پلتفرم و ارتقاءها

در جریان مهاجرت محدودیت‌های پلتفرم مشخص شد و Cloudflare برای پشتیبانی از بار کاری cdnjs ظرفیت‌های زیر را افزایش داد: زیردرخواست‌های Worker از 1,000 به 10,000,000 افزایش یافت و حداکثر گام‌های Workflow از 1,024 به 10,000 ارتقا پیدا کرد (قابلیت پیکربندی تا 25,000 نیز وجود دارد). این تغییرات نشان می‌دهد برای سرویس‌های عمومی با ترافیک بالا پلتفرم باید مقیاس‌پذیری چشمگیری داشته باشد.

پیامدها برای توسعه‌دهندگان و اکوسیستم وب

  • اجرای cdnjs روی پلتفرم Cloudflare نمونه‌ای عملی از به‌کارگیری ابزارهای ابری در مقیاس بزرگ است و می‌تواند اعتماد توسعه‌دهندگان به توانمندی‌های پلتفرم را افزایش دهد.
  • با تبدیل R2 به مرجع اصلی، مدیریت نسخه‌ها و توزیع محتوا ساده‌تر و پایدارتر می‌شود؛ این مدل می‌تواند الگویی برای دیگر پروژه‌های متن‌باز با ترافیک بالا ارائه کند.
  • افزایش ظرفیت Worker و Workflows امکان پیاده‌سازی جریان‌های انتشار پیچیده‌تر را فراهم می‌کند، به‌ویژه برای پروژه‌هایی که نیاز به پردازش و مینیفیکیشن در مقیاس دارند.

نگاهی رو به جلو

انتقال کامل cdnjs به پلتفرم توسعه‌دهندگان Cloudflare نشان می‌دهد ترکیب سرویس‌های توزیع‌شده و ذخیره‌سازی شیءمحور می‌تواند هم‌زمان عملکرد بالا و مدیریت متمرکز فراهم کند. گسترش پشتیبانی از جریان‌پردازی و کاهش وابستگی به کانتینرها از مهم‌ترین محورهایی است که باید پیگیری شوند؛ تحقق این موارد مسیر پردازش و انتشار بسته‌ها را ساده‌تر و کم‌هزینه‌تر خواهد کرد و نمونهٔ دیگری از مقیاس‌پذیری پلتفرم‌های ابری ارائه می‌دهد.