۰
یکی از دوستان لینکدینم ازم پرسید که چطوری میتونم یک برنامه رو مقیاس پذیر کنم. این سؤال بسیار خوبی است — اما پاسخ کوتاه و احتمالاً بسیار ناکافی که دادم، این بود که صبر کن ببین عملکرد کی افت میکند و بعد به سراغ بزرگترین عاملی برو که باعث کاهش عملکرد شده است. بعد دوباره همین روند را تکرار کن.
میتوانم حدس بزنم الان در ذهن خوانندگان حبابهای اعتراض درباره مواردی مثل CDN (شبکه تحویل محتوا)، کشینگ، بالانسکنندهی بار (Load Balancer) و اتواسکیلرها ایجاد شده است. بله، همهی اینها تکنیکهای عالیای هستند — اما فقط وقتی کاربرد دارند که واقعاً نیاز باشد. فرض کن نرخ ترافیک سایتت به حداکثر هزار درخواست در ساعت میرسد، در این صورت راهاندازی کش، لود بالانسر و چند نمونه سرور وب باعث پیچیدگی و افزایش هزینه عملیاتی میشود بدون اینکه ارزش افزودهای داشته باشد. از طرفی اگر مطمئنی سایتت میلیونها کاربر روزانه خواهد داشت، حتماً باید از همان ابتدا معماری را برای چنین بار سنگینی طراحی کنی. این کار هزینه و تلاش زیادی دارد، بنابراین امیدوارم تخمینهایت درست باشد.
در اغلب حالات، تا زمانی که عملکرد سایت را مثل یک عقاب زیر نظر بگیری و وقتی اعداد رشد کردند به موقع وارد عمل شوی، احتمالاً میتوانی به خوبی با رشد سایت همراه شوی.
تجربهام در نقش مهندس نرمافزار و معماری نرمافزار این موضوع را تأیید میکند. من روی سایتهای بزرگ تجارت الکترونیک، سیستمهای حیاتی سازمانی با صدها سایت در مناطق جغرافیایی گسترده و میلیونها خط کد کار کردهام، همچنین سایتهای تجارت الکترونیکی که عملکردشان برای مدیریت دهها میلیون مشتری در رویدادهای فروش خاص مهندسی شده بود را بهبود دادهام.
هدف این مقاله این نیست که تو را به یک کارشناس مهندسی عملکرد تبدیل کند، اما امیدوارم تصویری کلی از شاخصها، تکنیکها و راهکارهایی که میتوانی در مواجهه با افت عملکرد از آنها استفاده کنی بدهد؛ و اینکه وقتی یک شاخص عملکرد قرمز شد، بدانی از کجا باید شروع کنی.
شرکتهایی که در فضای اینترنت کسبوکار میکنند یا تبلیغ میکنند میدانند که SEO (بهینهسازی موتور جستجو) و زمان بارگذاری صفحات عوامل کلیدی در جذب، حفظ و تبدیل بازدیدکنندگان هستند. بر اساس تجربه من، SEO بیشتر به ورودیهای بازاریابی و محصول بستگی دارد، در حالی که زمان بارگذاری صفحه مسئولیت مهندسی است.
میزان پرش (بازدید کنندگان که سریع سایت را ترک میکنند) و نرخ تبدیل (افرادی که خرید را کامل میکنند) از شاخصهای کلیدی (KPI) برای سایتهایی هستند که از طریق بازدیدکننده درآمد کسب میکنند. پرش بالا و تبدیل پایین مساوی با درآمد کمتر است.
بارگذاری طولانیتر صفحات منجر به افزایش پرش و کاهش نرخ تبدیل میشود. گوگل از ژوئیه ۲۰۱۸ سرعت را در رتبهبندی صفحات وارد کرده است و آپدیتهای بیشتری نیز برای بهار ۲۰۲۰ برنامهریزی شده بود اما به دلیل همهگیری کرونا به ۲۰۲۱ موکول شد.
زمان بارگذاری صفحه میتواند متاثر از دستگاهی باشد که مرورگر روی آن اجرا میشود، شبکه بین مرورگر و سرور وب، و طراحی و پیادهسازی نرمافزار وب درخواست را پردازش میکند. اگر چه کنترل مرورگرها و شبکه دست تو نیست، میتوانی محتوایت را برای محیطهای چالشبرانگیز بهینهسازی کنی.
زمان بارگذاری نمونه به تفکیک زمان صرف شده روی مرورگر، انتقال در اینترنت و وب اپلیکیشن
عملکرد نرمافزار وب جمع کد، سرویسهایی مثل پایگاه داده و سیستمهای فایل، وابستگیهای شخص ثالث، زیرساختهای استقرار، شبکه تحویل درخواستها، و دستگاههایی که مرورگر روی آنها اجرا میشود و خود مرورگرها است. هر کدام میتوانند ضعیفترین حلقه در زنجیره و گلوگاه محدودکننده کل عملکرد باشند.
نمونهی مرورگر در حال ارسال درخواست به سرور وب که با سرویسهای خارجی صحبت میکند
یکی از رایجترین هزینههای از دست رفته (Opportunity Cost) و علت پیچیدگی غیرضروری، بهینهسازی زودهنگام است. مهندسان نرمافزار از تجربههای قبلی برای شناسایی سریع راهحلها برای چالشهای جدید استفاده میکنند و راهحلها را الگو-یابی میکنند تا به سرعت به نتیجه برسند. این معمولاً خوب جواب میدهد، ولی وقتی موضوع حل مشکلات عملکرد است، راهحلهایی که در یک پروژه عامل اصلی گلوگاه بودند، در پروژه دیگر الزاماً چنین نیستند.
مقیاسپذیری نرمافزار وب کار یکباره و تمام شونده نیست.
وبسایتهای مختلف الگوی دسترسی متفاوتی دارند که رفتار و کاربران آنها تعیین میکنند. حتی یک کد بیس و زیرساخت یکسان هم میتواند گلوگاههای مختلفی در عملکرد نشان دهد که این به رفتار و الگوی دسترسی کاربران بستگی دارد و ممکن است در طول زمان تغییر کند.
پس چارهای نداریم جز اینکه بهینهسازی عملکرد را صرفاً بر اساس دادههای واقعی انجام دهیم. سرویسهایی مانند Datadog APM و New Relic کل کد نرمافزارت را زیر نظر میگیرند، نقاطی را که بیشترین زمان در پردازش درخواست صرف شده نشان میدهند، مانند کوئریهای کند پایگاه داده، خواندن فایل، یا زمان صرف شده در سلسله تماس توابع.
داشتن یک داشبورد روی صفحه بزرگ با شاخصهای کلیدی وبسایت به صورت زنده راه سادهای برای تشخیص نشانههای غیرطبیعی است تا سریع به سراغ جزئیات رفته و جلوی ایجاد مشکل کلی را بگیری.
اگر از هاستهای رایگان برای برنامه وب استفاده کرده باشی متوجه شدهای که تاخیر پاسخدهیها زیاد است. این روش مناسب برای تست مفاهیم است و پروژههای پرتفولیو را ساده میزبانی میکند اما خدمات این چنینی بابت کاهش هزینه زیرساختها عملکرد را محدود میکنند. وقتی میخواهی جدی رشد کنی باید هزینهاش را بپردازی.
حالا اگر نظارت نشان داد:
معمولاً خروجی ابزار APM زمان و درصد مصرف شده روی بخشهای مختلف سیستم را هنگام پاسخ به یک درخواست مشخص میکند.
شاید وسوسه شوی به ترتیب از بیشترین گلوگاه به پایینتر به بهبود بپردازی، اما وقتی اولین گلوگاه مهم را بهبود دادی، احتمالاً گلوگاه بعدی متفاوت از دومین مورد در خروجی قبلی است و باید مجدداً بررسی شود.
اگر برنامه وب روی پلتفرم ابری PaaS یا IaaS مستقر باشد، محیط توسعه محلی معمولاً مکان مناسبی برای ارزیابی عملکرد نیست.
فهرست شخصیسازیشده و بر اساس تجربه ۳۰ سالهام از تکنیکهای معمول به ازای بازدهی در برابر هزینه و تلاش است. تکنیکهایی که بیشترین اثر و کمترین هزینه را دارند از همه بهترند و بالعکس. تکنیکهای کماثر معمولاً نباید وقت صرفشان کرد، اما گاهی تکنیکهای کماثر و کمهزینه به صورت وسوسهکننده به نظر میرسند که به آنها snacking گفته میشود.
این تاکتیکها معمولاً پیش از تحلیل دادهها توسط توسعهدهندگان مطرح میشوند و میتوانند پرهزینه و کمتاثیر باشند:
نگاه من نسبت به فناوریها بسیار عملیاتی است — معمولاً وقتی یک فناوری به شکل خوب و هوشمندانه اعمال شود، ممکن است مزایایی داشته باشد ولی به ندرت عملکرد خام عامل تصمیمگیری اصلی بوده است.
البته استثنا وجود دارد، مثلاً آمادهسازی یک سامانه خرید بلیط که فروش بلیط برای ۵ کنسرت ۷۰,۰۰۰ نفری را در لحظه آغاز باز میکند.
وقتی داشبورد دقیق متریکهای عملکردی را راه اندازی کردی و تیم به بهینهسازی بر اساس داده عادت کرد، وقتش است که گام بعدی برداری: جلوگیری از پسرفت عملکرد در تولید.
راهکار ساده است: اهداف زمان پاسخگویی برای همه صفحات درآمدزا تعیین کن و تستهایی در خط تولید CI/CD قرار بده که اگر عملکرد خراب شد جلوی انتشار گرفته شود.
این کار میتواند با تست زمان پاسخ در تستهای یکپارچهسازی، یا با ابزارهایی مثل Google Chrome Lighthouse انجام شود، یا سایر سرویسهای ثالث که زمان پاسخ را تست میکنند.
وقتی سایت مدتی است رشد کرده، درآمد زیاد شده و نگرانی از رشد ناگهانی و تقاضای پیک وجود دارد، وقت آزمایش فشار (Load Testing) است.
Load Testing شبیهسازی رفتارهای واقعی کاربران است — مثل جستجو، افزودن کالا به سبد خرید، ایجاد حساب و پرداخت. از تحلیل دادههای سایت میتوان نرخ و نسبت این رفتارها را فهمید. کاربران را در ابزارهایی مثل Locust یا Apache JMeter مدل کن و ببین وقتی کاربران بالاتر از مقدار واقعی استفاده میکنند، سیستم چطور عمل میکند.
اگر رفتار کاربران را به خوبی مدل کرده باشی، Load Testing کمک میکند گلوگاه بعدی وقتی ترافیک بیشتر شد مشخص شود. البته ممکن است گروههای جدیدی با رفتار متفاوت وارد شوند... خب، با رشد پیچیدگی هم افزایش مییابد.
مقیاسپذیری وب اپلیکیشنها وقتی بر اساس دادهها و شواهد انجام شود، دیگر یک هنر حدسی و بدون پایه نیست. اندازهگیری دقیق و تحلیل سهباره قبل از هر کار، کلید تمرکز بهینهسازیها است.
حدود ریسک بارگذاری تعریف کن، آنها را در تستهای CI/CD بگنجان و اینطوری میتوانی بی دغدغه روی ویژگیهای جدید کار کنی بدون اینکه مردم از افت سرعت یا کاهش رتبه صفحه نگران باشند.
رفتار شناخته شده کاربران را مدل کن و با تست فشار یک قدم جلوتر از رشد بمان.
نظرات، دیدگاهها و نقدهای شما حتما برای یادگیری و پیشرفت ما مفید هستند. خوشحال میشویم نظرتان را بدانیم!
اگر این مطلب برایت جالب بود و دوست داری به ما در توسعه و مقیاسپذیری نرمافزار کمک کنی، لطفاً صفحه فرصتهای شغلی ما را ببین.
سپاس ویژه از استنفنی چنی و سوفی پارکر بابت بازخوردهای بسیار مفیدشان!
۰
کد با می متعهد است که بالاترین سطح کیفی آموزش را در اختیار شما بگذارد. هدف به اشتراک گذاشتن دانش فناوری اطلاعات و توسعه نرم افزار در بالاترین سطح ممکن برای درستیابی به جامعه ای توانمند و قدرتمند است. ما باور داریم هر کسی میتواند با استمرار در یادگیری برنامه نویسی چالش های خود و جهان پیرامون خود را بر طرف کند و به موفقیت های چشم گیر برسد. با ما در این مسیر همراه باشید. کد با می اجتماع حرفه ای برنامه نویسان ایرانی.