برنامه نویسی

فراتر از تغییر فناوری: مقیاس‌بندی کارآمد برنامه‌های کاربردی

اغلب، هنگام مواجهه با مشکلات مقیاس پذیری در برنامه های ما، اولین واکنش این است که به تغییر زبان یا چارچوب فکر کنیم.

فناوری هایی که ما استفاده می کنیم در واقع برای سرعت و مقیاس پذیری برنامه ما بسیار مهم هستند. با این حال، آنها تنها عواملی نیستند که باید در نظر گرفته شوند.

با این حال، این تصمیم ممکن است بهترین تصمیم نباشد، زیرا راه های مختلفی برای سریعتر و کارآمدتر کردن برنامه شما بدون تغییر تکنولوژی وجود دارد.

توضیحات تصویر

قبل از اینکه به جزئیات نحوه مقیاس‌بندی برنامه خود بپردازیم، مهم است که بدانیم وقتی درخواستی به سرور می‌رسد چه اتفاقی می‌افتد. هنگامی که این اتفاق می افتد، یک وب سرور (مانند NGINX یا APACHE) مسئول پردازش درخواست و ارسال آن به برنامه مربوطه است.

به عبارت دیگر، وب سرور اولین نقطه تماس بین برنامه شما و کاربر است.

اما همانطور که در مورد برنامه های پویا صحبت می کنیم، مسیری که درخواست طی می کند به وب سرور ختم نمی شود. کد برنامه شما باید به طریقی اجرا شود، یا از طریق یک اسکریپت (مثلاً در مورد لاراول) یا یک فرآیند مدیریت شده توسط یک سرور برنامه (مانند Passeger، در مورد Rails). و البته اطلاعات دستکاری شده توسط اپلیکیشن در یک پایگاه داده ذخیره می شود.

همه اینها به این معنی است که مقیاس پذیری یک برنامه کاربردی به عوامل زیادی فراتر از انتخاب فناوری بستگی دارد. برای اطمینان از اینکه برنامه شما مقیاس پذیر است و گلوگاه ایجاد نمی کند، لازم است همه این عناصر را در نظر گرفته و آنها را به بهترین شکل ممکن بهینه کنید.

در گردش کار برنامه شما، همه چیز می تواند همزمان باشد، به این معنی که اگر پایگاه داده شما یک ثانیه طول بکشد تا بارگذاری شود، درخواست شما یک ثانیه تاخیر خواهد داشت. در چنین مواردی، انتخاب فریم ورک شما تفاوتی ایجاد نمی کند، زیرا گلوگاه احتمالاً در پایگاه داده، سرور یا نقطه دیگری از برنامه شما است.

اگر یک برنامه سریع می خواهید، باید در هر فرآیند سریع باشید.

تنگناها را شناسایی کنید.

توضیحات تصویر

برای آن می توانید از برخی ابزارها مانند New Relic استفاده کنید

شرایطی وجود دارد که به نظر می رسد همه چیز خوب است.

برنامه شما به درستی پیکربندی شده است، اما هنوز همه چیز در محصول شما کمی سفت و کند به نظر می رسد. من به 3 سناریوی رایج می پردازم:

1- وظایف آهسته:

تصور کنید که یک ویژگی دارید که در آن وقتی کاربر یک فایل CSV را آپلود می کند، برنامه شما هر خط از آن آرشیو را اسکن می کند و آن را در یک پایگاه داده ذخیره می کند.

اگر CSV شما 15 خط داشته باشد، سریع خواهد بود، اما اگر دارای یک میلیون خط باشد، ممکن است شروع به کند شدن کند. در این صورت چیز زیادی برای فرار نیست 😔.

این یک فرآیند و کار به طور طبیعی کند است. اما یک راه حل خوب برای بهبود تجربه کاربر، پیاده سازی مفهوم QUEUES است.

یک صف به این صورت عمل می کند: شما فرآیندی را انتخاب می کنید که به صورت همزمان اجرا می شود و آن را در چیزی که ما JOBS می نامیم جدا می کنید. بنابراین اکنون یک شغل داریم که می توانیم آن را “ProcessCSV” بنامیم. شما این را در یک کلاس جداگانه قرار می دهید و زمانی که کاربر CSV را ارسال می کند، به جای پردازش آن در آن زمان، آن کار را به صف می فرستید، که فرآیند دیگری است که کارهای ارسال شده را می گیرد، آنها را پردازش می کند و بعد از آن حذف می شود. در حال پردازش. به عبارت دیگر، برنامه خود را ناهمزمان تر می کنید.

اما این نیاز به UX خوب دارد. شما باید آن را برای کاربر خود روشن کنید. مشتری شما باید بداند که با وظیفه ای که برای برنامه شما درخواست کرده است چه اتفاقی می افتد. برای آن، من همچنین توصیه می کنم در مورد ماشین های دولتی مطالعه کنید.

2 – کش عشق است، اما همیشه عشق خوب نیست.

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

داده های قدیمی ندارید، مراقب باشید.

با این حال، انجام این کار همیشه خوب نیست. فرض کنید سایت شما ارزش به روز شده بیت کوین را نسبت به دلار برمی گرداند. برای این، ماندگاری 100٪ این داده ها در حافظه نهان جالب نیست، با توجه به اینکه در مدت زمان کوتاهی، کاربر شما می خواهد ارزش جدید بیت کوین را بداند، با توجه به اینکه نوسانات زیادی دارد.

می‌توانید یک ویدیوی جامع را تماشا کنید که در آن توضیح می‌دهم چگونه نوشتن کش را در برنامه frontend خود پیاده‌سازی می‌کنم

ابزارهای کش و نمونه هایی از استفاده

گربه ها در مورد حافظه پنهان بحث می کنند

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

برای مدیریت این سطح از ترافیک، می‌توانید از ابزارهایی مانند Varnish HTTP Cache استفاده کنید که اطلاعات یک مقاله خبری را از اولین کاربری که به آن دسترسی پیدا کرده و درخواست را ارسال می‌کند، در حافظه پنهان ذخیره می‌کند. هنگامی که Varnish صفحه را کش کرد، کاربران بعدی پاسخی را دریافت خواهند کرد که در حافظه ذخیره می شود. این فرآیند به شما این امکان را می دهد که از درخواست های همزمان غیر ضروری اجتناب کنید و پاسخی سریع به کاربران ارسال کنید.

به عبارت دیگر، Varnish درخواست را رهگیری می کند و یک پاسخ از پیش ذخیره شده، زیبا و خوشبو برای کاربران شما ارسال می کند بدون اینکه سرور را با میلیون ها درخواست غیر ضروری غرق کند. با این حال، انجام برخی اقدامات امنیتی، مانند تأیید اینکه آیا اخبار تغییر کرده است یا بررسی اینکه آیا محتوا تغییر کرده است، مهم است.

استفاده از ابزاری مانند Varnish HTTP Cache یک راه عالی برای سریعتر کردن صفحه شما و مدیریت حجم بالای ترافیک به راحتی است.

آخرین اما نه کم اهمیت – کد خود را بهبود بخشید

من یک مقاله کامل در مورد آن خواهم نوشت، اما فعلا:

بهبود کد شما برای موفقیت هر پروژه برنامه نویسی بسیار مهم است.
کد بد همه ویژگی ها را دشوارتر می کند و زمان بیشتری را برای استقرار می گیرد. و زمان پول است.

اگر به صورت تیمی کار می کنید، داشتن ابزارها و فرآیندهای مناسب برای اطمینان از اینکه همه چیز به خوبی پیش می رود، مهم است. در حالی که راه های زیادی برای رسیدن به این هدف وجود دارد، در اینجا چند نکته کلیدی وجود دارد که می توانید آنها را پیاده سازی کنید:

  • از ابزارهای اشکال زدایی کارآمد برای شناسایی و رفع سریع خطاها استفاده کنید.

  • کد خود را به طور کامل تست کنید تا مشکلات احتمالی را قبل از ایجاد مشکل پیدا کنید.

  • برای بهبود خوانایی و نگهداری از نام متغیرهای واضح و توصیفی استفاده کنید.

  • از ابزارهای Lint برای شناسایی و رفع اشتباهات رایج کدنویسی استفاده کنید.

… (در صورت لزوم نکات اضافی را اضافه کنید)

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

توضیحات تصویر


با تشکر از @sibelius برای ارائه سوال.
از فابیو آکیتا و ماتئوس گیماریس برای توضیح برخی موضوعات متشکرم.

امیدوارم این پست بتواند مفید باشد!
برای بازخورد یا مطالب بیشتر، من را دنبال کنید توییتر یا github

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا