در دنیای پرشتاب تکنولوژی، کسبوکارها و توسعهدهندگان هر روز بهدنبال راههایی برای سادهسازی فرایند توسعه، کاهش هزینهها و افزایش مقیاس کسبوکار خودشان هستند. یکی از تحولهای بزرگ در این مسیر، معماری Serverless یا «معماری بدون سرور» است؛ مفهومی که بر خلاف نامش، به معنی حذف کامل سرورها نیست، بلکه به حذف نیاز توسعهدهنده برای مدیریت مستقیم سرورها اشاره میکند.
در معماری Serverless، تمرکز توسعهدهنده فقط روی نوشتن کدهای عملکردی است، در حالی که زیرساخت لازم برای اجرای این کدها بهصورت کاملا خودکار توسط ارائهدهندگان خدمات ابری مدیریت میشود. این رویکرد نهتنها باعث صرفهجویی در زمان و هزینه میشود، بلکه امکان ایجاد سیستمهایی مقیاسپذیر و واکنشگرا را هم فراهم میکند. در این مقاله از مجله آسا قصد داریم به بررسی دقیق معماری Serverless بپردازیم، مزایا و معایب آن را بشناسیم و با کاربردهای رایج این معماری آشنا شویم.
معماری Serverless چیست؟
معماری Serverless یک رویکرد نوین در طراحی نرمافزار است که به شما اجازه میدهد بدون نیاز به مدیریت زیرساختهای فنی، سرویسها و برنامههای خودتان را ایجاد و اجرا کنید. در این مدل، توسعهدهنده صرفا روی نوشتن و استقرار کد تمرکز میکند، در حالی که ارائهدهنده خدمات ابری بهصورت خودکار منابع لازم مثل سرورها، پایگاه داده و سیستمهای ذخیرهسازی را در هر مقیاسی که نیاز باشد، فراهم میکند.
در حالت سنتی، سرورها مسئول ارتباط کاربران با برنامه و دسترسی به منطق تجاری آن هستند ولی مدیریت این سرورها نیازمند صرف زمان و منابع زیادی است. تیمها باید سختافزار سرورها را نگهداری کنند، بهروزرسانیهای نرمافزاری و امنیتی را انجام دهند و در صورت بروز مشکل، بهسرعت عملیات بازیابی نسخههای پشتیبان را شروع کنند. به وسیله معماری Serverless، این وظیفهها به یک ارائهدهنده شخص ثالث سپرده میشود و توسعهدهندگان میتوانند تمرکزشان را صرفا روی توسعه کدهای کاربردی بگذارند.
مفاهیم پایه در معماری Serverless
هرچند معماری Serverless نیاز به مدیریت مستقیم سرورها را از بین میبرد، ولی همچنان درک آن بهویژه در پروژههای پیچیدهای که شامل زنجیرهای از توابع هستند، نیازمند یادگیری مفاهیم خاصی است. آشنایی با این اصطلاحات پایه به درک بهتر این معماری کمک میکند.
۱. Invocation (فراخوانی): هر بار که یک تابع Serverless اجرا میشود، به آن یک فراخوانی گفته میشود. مثلا اگر تابعی برای پردازش یک فرم طراحی کردهاید و کاربران در روز ۱۰۰ بار فرم را ارسال میکنند، شما ۱۰۰ فراخوانی خواهید داشت.
۲. Duration (مدت زمان اجرا): مدت زمانی که اجرای یک تابع از لحظه شروع تا پایان آن طول میکشد. این زمان برای محاسبه هزینه اجرای توابع اهمیت دارد؛ چون بیشتر ارائهدهندگان سرورهای ابری بر اساس تعداد فراخوانی و مدت اجرا هزینه دریافت میکنند.
۳. Cold Start (شروع سرد): وقتی یک تابع برای اولین بار یا پس از مدتزمانی بدون استفاده بودن اجرا میشود، ممکن است تاخیری در اجرای اولیه به وجود بیاید. به این تاخیر شروع سرد گفته میشود. علت آن این است که ارائهدهنده ابری باید ابتدا منابع لازم (مثل یک کانتینر یا سرور مجازی) را فراهم کرده و تابع را در آن بارگذاری کند.
۴. Concurrency Limit (محدودیت همزمانی): تعداد دفعاتی که میتوان توابع را به صورت همزمان اجرا کرد که توسط ارائهدهنده ابری در هر منطقه جغرافیایی مشخص میشود. اگر توابع بیشتر از این محدودیت فراخوانی شوند، ممکن است با Throttling مواجه شوند، یعنی اجرای آنها کند یا متوقف شود.
۵. Timeout (زمان مجاز اجرا): هر تابع Serverless فقط تا مدت زمان مشخصی میتواند اجرا شود. اگر زمان اجرا از حد مورد نظر بیشتر شود، تابع توسط سیستم بهطور خودکار متوقف میشود. برای مثال، ممکن است زمان پیشفرض برای یک تابع ۳۰ ثانیه باشد و حداکثر زمانی که میتوان برای آن تعیین کرد بسته به ارائهدهنده سرویس ابری، ۱۵ دقیقه باشد.
بهصورت کلی هر پلتفرم ابری ممکن است نامگذاریها یا محدودیتهای متفاوتی برای توابع Serverless داشته باشد، ولی مفاهیم بالا اصول پایهای و مشترک بین تمام ارائهدهندگان هستند.
مزایا و معایب معماری Serverless
در سالهای اخیر، استفاده از معماری Serverless بهطور قابلتوجهی افزایش یافته است؛ بهطوریکه حدود ۴۰٪ از شرکتها در سراسر جهان از آن به نوعی بهره میبرند. از استارتاپهای کوچک گرفته تا شرکتهای بینالمللی، همگی به دلیل مزایای Serverless، به سراغ این معماری رفتهاند. ولی این معماری در کنار نکات مثبت، معایبی هم دارد. در ادامه جوانب خوب و بد این معماری را بررسی میکنیم.
مزایا
- کاهش هزینهها: در مدل Serverless، هزینهها بر اساس تعداد دفعات فراخوانی توابع محاسبه میشود. یعنی بهصورت ۲۴ ساعته برای سرورهای بیکار یا ماشینهای مجازی رزرو شده پولی نمیدهید. فقط زمانی پول پرداخت میکنید که کد شما واقعا اجرا شود.
- مقیاسپذیری خودکار: توابع در چارچوب محدودیتهای همزمانی (Concurrency) بهصورت خودکار در پاسخ به افزایش یا کاهش ترافیک، در لحظه ایجاد یا حذف میشوند.
- افزایش بهرهوری تیم توسعه: برنامهنویسان میتوانند بدون نیاز به مدیریت سرور تنها با نوشتن کد و استقرار آن، برنامه مد نظرشان را راهاندازی کنند. این مزیت باعث سریعتر شدن چرخه توسعه میشود.
معایب
- از دست رفتن کنترل: در محیط Serverless، کنترل مستقیم روی پشتهی نرمافزاری (Software Stack) وجود ندارد. اگر اختلالی در سختافزار، دیتاسنتر یا سرویسدهنده اتفاق بیفتد، توسعهدهنده باید منتظر بماند تا مشکل توسط ارائهدهنده ابری رفع شود.
- چالشهای امنیتی: ارائهدهندگان ابری ممکن است کدهای چندین مشتری را بهصورت همزمان روی یک سرور اجرا کنند. اگر این سرور بهدرستی ایزوله نشده باشد، ممکن است دادههای حساس برنامه شما در معرض خطر قرار بگیرند.
- تاخیر ناشی از شروع سرد (Cold Start): در صورتی که یک تابع پس از مدتزمانی غیرفعال، فراخوانی شود، ممکن است چند ثانیه تاخیر در اجرای اولیه داشته باشد. این تاخیر بهویژه در برنامههای حساس به زمان (Real-time) میتواند مشکلساز باشد.
- مشکلات تست و اشکالزدایی: اگرچه تست واحد (unit test) برای توابع ساده است ولی تستهای یکپارچه (integration tests) که تعامل بخشهای مختلف برنامه را بررسی میکنند، در محیط Serverless پیچیدهتر و محدودتر هستند.
- وابستگی به ارائهدهنده (Vendor Lock-In): ارائهدهندگانی مثل Azure، AWS یا Google Cloud خدمات متنوعی مثل پایگاهداده، صفهای پیام و APIها ارائه میدهند که برای معماری Serverless طراحی شدهاند. استفاده خیلی زیاد از خدمات یک ارائهدهنده ممکن است باعث شود جابهجایی به پلتفرم دیگر دشوار و پرهزینه باشد.
چه زمانی Serverless مناسب است؟
شرکتهایی که میخواهند سریعتر محصولشان را به بازار برسانند و اپلیکیشنهایی سبک و مقیاسپذیر توسعه دهند، میتوانند به خوبی از Serverless بهره ببرند. ولی اگر اپلیکیشن شما شامل فرایندهای پیوسته و طولانیمدت است، استفاده از ماشینهای مجازی یا کانتینرها ممکن است انتخاب بهتری باشد.
در بسیاری از موارد، ترکیبی از این روشها (زیرساخت هیبریدی) هم قابل استفاده است. به طور مثال، وظایف اصلی با کانتینر انجام میشوند، در حالی که وظایف سبکتر مثل ذخیرهسازی اطلاعات در پایگاهداده با توابع Serverless اجرا میشوند.
کاربردها معماری Serverless
معماری Serverless بیشتر برای وظایف کوتاهمدت و بارهای کاری با ترافیک غیرمداوم یا غیرقابلپیشبینی مناسب است. در ادامه، مهمترین موارد استفاده از این معماری را مرور میکنیم.
۱- وظایف مبتنی بر تریگر (Trigger-Based Tasks)
یکی از رایجترین کاربردهای Serverless، انجام وظایفی است که بر اساس رویداد یا تریگر کاربر اجرا میشوند. برای مثال، وقتی کاربر در یک وبسایت ثبتنام میکند، میتوانیم با استفاده از توابع Serverless اطلاعات او را در پایگاهداده ذخیره کنیم و سپس بهطور خودکار ایمیل خوشآمدگویی برایش ارسال کنیم. این نوع زنجیره واکنشها را میتوان بدون نیاز به اجرای دائمی سرور، با مجموعهای از توابع کوچک و مستقل پیادهسازی کرد.
۲- ساخت APIهای RESTful
معماری Serverless برای ساخت APIهای تحت وب (RESTful) هم بسیار کاربردی است. با استفاده از سرویسهایی مانند Amazon API Gateway، میتوانید توابع Serverless را بهعنوان نقطه پایانی API تعریف کنید. این APIها به صورت خودکار با افزایش یا کاهش ترافیک، مقیاسپذیر میشوند و به شما این امکان را میدهند که بدون مدیریت زیرساخت، رابطهای کارآمدی برای اپلیکیشنهای خود بسازید.
۳- پردازشهای غیر همزمان (Asynchronous Processing)
وظایفی که نیاز به اجرا در پشتصحنه دارند و نباید تاثیری بر تجربه کاربر داشته باشند، بهترین موارد استفاده از Serverless هستند. برای مثال، رندر کردن اطلاعات محصولات، پردازش فایلهای آپلود شده یا تبدیل فرمت ویدیوها (Transcoding) را میتوان بهصورت توابع مستقل و غیر همزمان (Asynchronous) اجرا کرد، بدون اینکه کندی یا تاخیری در رابط کاربری ایجاد شود.
۴- بررسیهای امنیتی (Security Checks)
معماری Serverless میتواند به اجرای خودکار عملیات امنیتی در نقاط حساس مراحل توسعه کمک کند. مثلا، در زمان راهاندازی یک کانتینر جدید، میتوان تابعی را اجرا کرد که آن را از نظر آسیبپذیریها یا تنظیمات اشتباه بررسی کند. همچنین میتوان از توابع برای فرآیندهای احراز هویت، مثل بررسی SSH یا احراز هویت دو مرحلهای، استفاده کرد تا امنیت اپلیکیشن افزایش پیدا کند.
۵- اتوماسیون در CI/CD
Serverless نقش خیلی مهمی در خودکارسازی مراحل یکپارچهسازی و تحویل مداوم (CI/CD) دارد. بهعنوان مثال، وقتی که توسعهدهندهای تغییری در کد اعمال میکند (commit)، تابعی میتواند بهطور خودکار فرایند Build را اجرا کند. همچنین، با ثبت Pull Request، تابع دیگری میتواند تستهای خودکار را انجام دهد. این روند، سرعت توسعه را افزایش داده و خطای انسانی را کاهش میدهد.
سرویسهای معروف در معماری Serverless
پلتفرمهای Serverless به شما این امکان را میدهد که بدون دغدغهی زیرساخت، سریعتر و موثرتر اپلیکیشن بسازید. در ادامه، با پنج پلتفرم محبوب و کاربردی در حوزهی محاسبات Serverless آشنا میشویم که هرکدام ویژگیها و مزایای خاص خودشان را برای پروژههای کوچک تا سازمانی ارائه میدهند.
۱- Genezio
Genezio یک پلتفرم ابری فولاستک است که به توسعهدهندگان کمک میکند اپلیکیشنهای کامل خود را بدون نیاز به مدیریت زیرساخت پیادهسازی و منتشر کنند. این پلتفرم از زبانهای مختلفی از جمله TypeScript و Go پشتیبانی میکند و بهصورت framework-agnostic طراحی شده است؛ یعنی با فریمورکهای محبوبی مثل Express.js، Fastify و Next.js بهراحتی سازگار میشود.
یکی از ویژگیهای مهم Genezio تولید خودکار SDK برای اتصال ساده بین فرانتاند و بکاند است. همچنین امکانات داخلی مثل احراز هویت، مدیریت دیتابیس و زمانبندی وظایف را در اختیارتان قرار میدهد.
پلن رایگان برای پروژههای شخصی و تیمهای کوچک مناسب است و پلن حرفهای فقط با ۱۵ دلار در ماه برای تیمهای حداکثر ۱۰ نفر ارائه میشود. شرکتهای بزرگتر نیز میتوانند از پلن سازمانی استفاده کنند. با Genezio توسعهدهندگان میتوانند به جای مدیریت سرور، تمرکزشان را صرف توسعه اپلیکیشن کنند؛ چون این پلتفرم مقیاسپذیری را بهصورت خودکار انجام میدهد و یک انتخاب قابلاعتماد برای راهاندازی سریع یا پروژههای بلندمدت به شمار میرود.
۲- AWS Fargate
Fargate یکی از سرویسهای Serverless شرکت آمازون است که کمتر از AWS Lambda دربارهاش صحبت میشود ولی برای کسانی که در اکوسیستم AWS کار میکنند گزینهای قوی محسوب میشود. این سرویس با سایر سرویسهای AWS بهخوبی یکپارچه میشود.
هزینهها براساس تعداد درخواستها و مدت زمان اجرای توابع محاسبه میشود؛ هرچند بسیاری از کاربران آن را نسبتا گرانقیمت میدانند. با وجود ماشینحساب قیمتگذاری AWS، تخمین دقیق هزینه برای اپلیکیشنهایی که بهصورت ناگهانی رشد میکنند، سخت است. به همین دلیل، بعضی از توسعهدهندگان ترجیح میدهند از Lambda برای پیادهسازی مشابه استفاده کنند.
۳- Google Cloud Functions
Google Cloud Functions سرویس Serverless گوگل است که برای پردازشهای رویدادمحور (Event-Driven) طراحی شده و بهصورت خودکار مقیاسپذیر است. این سرویس از زبانهایی مثل Node.js، Python، Go، Java، .NET Core، Ruby و PHP پشتیبانی میکند.
قیمتگذاری آن براساس تعداد درخواستها و میزان مصرف منابع است. دو میلیون درخواست اول رایگان است و پس از آن هر یک میلیون درخواست، ۰.۴۰ دلار هزینه دارد. این پلتفرم با سرویسهایی مثل Cloud Pub/Sub، Cloud Storage و Firebase یکپارچه است و ابزارهایی مثل Cloud Trace برای رهگیری و خطایابی توزیعشده ارائه میدهد.
با اینکه محدودیتهایی مثل تایماوت ۵۴۰ ثانیهای، حافظهی حداکثر ۸ گیگابایت و حجم استقرار ۱۰۰ مگابایت فشرده دارد، ولی در اجرای بدونوضعیت (Stateless Execution) عملکرد خیلی خوبی دارد و در جامعهی توسعهدهندگان، پلتفرمی قابل اعتماد محسوب میشود.
۴- Microsoft Azure Functions
Azure Functions پلتفرم Serverless مایکروسافت است که برای توسعه و استقرار اپلیکیشنهای رویدادمحور استفاده میشود. این سرویس بخشی از اکوسیستم بزرگ Azure است که بیش از ۱۰۰ ابزار توسعه، تست و مدیریت نرمافزار دارد.
Azure چندین پلن قیمتگذاری دارد:
- پلن مصرفی (Consumption Plan) که بر اساس تعداد اجراها و مصرف حافظه هزینه میگیرد.
- پلن Premium برای عملکرد بهتر و کاهش Cold Start طراحی شده است.
- پلن Dedicated که برای بارهای پردازشی مداوم مناسب است.
این پلتفرم از زبانهای C#، JavaScript، F#، Java، PowerShell، Python و TypeScript پشتیبانی میکند و با ابزارهای DevOps مایکروسافت یکپارچه شده، که فرایند CI/CD را آسانتر میکند.
۵- Vercel Functions
Vercel Functions یک پلتفرم Serverless با تمرکز ویژه برای توسعه وب است که درون پلتفرم Vercel عرضه میشود. این سرویس دو نوع عملکرد دارد:
- Serverless Functions که روی AWS Lambda اجرا میشوند و از زبانهایی مثل Node.js، Python، Go و Ruby پشتیبانی میکنند.
- Edge Functions که برای اجرا در لبه شبکه با سرعت بسیار بالا، از موتور V8 استفاده میکنند.
Vercel سه پلن دارد:
- پلن رایگان (Hobby) برای استفادههای غیرتجاری.
- پلن Pro با هزینه ۲۰ دلار در ماه.
- پلن Enterprise با قیمتگذاری سفارشی.
این پلتفرم مخصوصا برای پروژههای مبتنی بر Next.js بهینهسازی شده است؛ چرا که Vercel توسط تیم سازنده Next.js توسعه یافته است.
سخن آخر
معماری Serverless یک راه مدرن و جدید برای توسعه نرمافزار است که با حذف نیاز به مدیریت زیرساختهای فیزیکی، به توسعهدهندگان کمک میکند تا سریعتر و با هزینه کمتر کد بنویسند و منتشر کنند. این معماری بهخصوص برای وظایف کوتاهمدت، پردازشهای غیر همزمان، ساخت API، بررسیهای امنیتی و خودکارسازی CI/CD بسیار موثر است.
در کنار مزایایی مثل مقیاسپذیری خودکار و صرفهجویی در هزینه، چالشهایی مثل کنترل کمتر روی محیط اجرا، تاخیر اولیه (cold start)، تست دشوار و وابستگی به ارائهدهندگان وجود دارد. با این حال، برای بسیاری از پروژهها، مخصوصا آنهایی که نیاز به سرعت و مقیاسپذیری دارند، Serverless انتخاب مناسبی است. مهاجرت تدریجی و استفاده ترکیبی با زیرساختهای سنتی میتواند راهحلی مناسب و مطمئن باشد.
منابع
datadoghq.com | deployapps.dev
سوالات متداول
میکروسرویسها به معنی تقسیم اپلیکیشن به سرویسهای کوچک و مستقل هستن که روی سرورهای مشخص اجرا میشن. در مقابل، سرورلس روی «فانکشنها» تمرکز داره و نیازی به مدیریت زیرساخت سرورها نیست؛ همه چیز توسط سرویسدهنده ابری مدیریت میشه. در واقع، میشه گفت سرورلس سطحی بالاتر از انتزاع رو ارائه میده و توسعهدهنده فقط روی منطق کد تمرکز میکنه.
پرکاربردترین ارائهدهندهها در این حوزه عبارتاند از:
– AWS Lambda (آمازون) که محبوبترین و پیشرو در این زمینه است.
– Google Cloud Functions با ادغام راحت در سرویسهای گوگل.
– Azure Functions (مایکروسافت) برای پروژههایی که روی اکوسیستم مایکروسافت کار میکنن.
انتخاب بین این سرویسها بستگی به نیاز پروژه، بودجه و پلتفرم فعلی شما داره.
بله، اما همیشه ساده نیست. اپلیکیشنهایی که از ابتدا برای سرورلس طراحی نشدهان، ممکنه نیاز به بازطراحی بخشهایی داشته باشن تا با محدودیتهای سرورلس (مثل زمان اجرای فانکشن یا مدیریت state) سازگار بشن. در عوض، بخشهایی از سیستم که مستقلتر هستن (مثل پردازش فایل، اجرای تسکهای زمانبندیشده یا APIهای سبک) راحتتر قابل مهاجرت به سرورلس هستن.
دیدگاهتان را بنویسید