مقیاس‌پذیری پردازش اسناد با .NET Core
← Back to Blog4 min read

مقیاس‌پذیری پردازش اسناد با .NET Core

همان‌طور که برنامهٔ شما از یک پروژهٔ آزمایشی به یک پلتفرم سطح سازمانی رشد می‌کند، تقاضاها بر روی زیرساخت‌تان به‌طور چشمگیری تغییر می‌کنند. پردازش اسناد—نمایش، تبدیل و OCR—به‌طور محاسباتی سنگین است. راه‌حلی که برای ۱۰ کاربر به‌خوبی کار می‌کند، می‌تواند هنگام مواجهه با ۱۰,۰۰۰ کاربر همزمان متوقف شود.

در دنیای سیستم‌های بار بالا، مقیاس‌پذیری پادشاه است. توسعه‌دهندگان به معماری‌ای نیاز دارند که افزایش ناگهانی ترافیک را به‌نرمی مدیریت کند، منابع را به‌کارآمدی مصرف کند و هزینه‌ها را پیش‌بینی‌پذیر نگه دارد. در اینجا ترکیب پروفایل عملکرد بهبود یافتهٔ .NET Core و معماری مقیاس‌پذیر Doconut می‌درخشد. در این مقاله، استراتژی‌های مقیاس‌پذیری خط لوله‌های پردازش اسناد با استفاده مؤثر از .NET Core و Doconut را بررسی خواهیم کرد.

ویژگی‌های عملکردی پردازش اسناد

برای مقیاس‌پذیری مؤثر، ابتدا باید بار کاری را درک کنیم. پردازش اسناد منحصربه‌فرد است زیرا اغلب همزمان تحت محدودیت‌های سه منبع اصلی قرار می‌گیرد:

  1. CPU Bound: رندر کردن یک PDF برداری پیچیده یا تبدیل یک نقشهٔ CAD به محاسبات ریاضی قابل‌توجهی نیاز دارد.
  2. Memory Bound: بارگذاری یک نقشهٔ با وضوح بالا و حجم ۵۰۰ مگابایت در حافظه برای پردازش آن به یک heap بزرگ نیاز دارد و فشار بر روی جمع‌کنندهٔ زباله (GC) را افزایش می‌دهد.
  3. I/O Bound: خواندن فایل‌های منبع بزرگ از دیسک/ابری و نوشتن کاشی‌های کش شده شامل عملیات ورودی/خروجی قابل‌ملاحظه‌ای می‌شود.

مقیاس‌پذیری این موارد نیاز به رویکردی چندوجهی دارد که از قوت‌های زمان اجراهای مدرن .NET Core استفاده می‌کند.

استراتژی ۱: قدرت ورودی/خروجی ناهمگام (Async/Await)

برنامه‌های قدیمی .NET اغلب دچار کمبود منابع در استخر نخ‌ها (thread pool starvation) می‌شدند. اگر یک درخواست وب نخ را در حالی که منتظر بارگذاری فایل از دیسک بود مسدود می‌کرد، سرور نخ‌های لازم برای پردازش درخواست‌های جدید را از دست می‌داد و باعث خطاهای ۵۰۳ می‌شد حتی اگر پردازنده مشغول نبود.

Doconut به‌طور کامل برای الگوی Async/Await موجود در .NET Core بهینه‌سازی شده است. هر عملیات I/O—خواندن فایل منبع، دریافت لایسنس، نوشتن در کش—باید به‌صورت ناهمگام باشد.

با اطمینان از اینکه کنترلر نمایش شما از متدهای async تا انتهای زنجیره استفاده می‌کند، یک نمونه سرور می‌تواند هزاران اتصال همزمان باز را مدیریت کند، به‌طور مؤثر برای تکمیل I/O صبر کرده و بدون مسدود کردن نخ‌ها عمل می‌کند.

استراتژی ۲: کش توزیعی

در یک راه‌اندازی تک‌سرور، کش کردن صفحات رندر شده در حافظه (IMemoryCache) سریع و آسان است. اما این در یک محیط مقیاس‌پذیر (مزرعه وب) ناکام می‌شود. اگر کاربر A به سرور ۱ متصل شود، صفحه در آنجا کش می‌شود. اگر درخواست بعدی او به سرور ۲ برسد، باید دوباره رندر شود که باعث هدر رفتن CPU می‌شود.

برای پردازش مقیاس‌پذیر اسناد، باید کش توزیعی را پیاده‌سازی کنید. Doconut از ایجاد ارائه‌دهندگان کش سفارشی پشتیبانی می‌کند. با پیاده‌سازی ارائه‌دهنده کش Redis یا SQL Server، اطمینان حاصل می‌کنید که کار طاقت‌فرسای رندر کردن یک صفحه دقیقاً یک بار انجام می‌شود.

  • Scenario: کاربر درخواست صفحه ۱ از "AnnualReport.pdf" می‌کند.
  • Server 1: Redis را بررسی می‌کند. یافت نشد. صفحه را رندر می‌کند. کاشی را در Redis ذخیره می‌کند. تصویر را برمی‌گرداند.
  • Server 2 (در حال پردازش کاربر دیگر): Redis را بررسی می‌کند. یافت شد! بلافاصله تصویر را برمی‌گرداند.

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

استراتژی ۳: ذخیره‌سازی لایه‌ای هوشمند

ذخیره میلیون‌ها سند نیاز به استراتژی ذخیره‌سازی هوشمند دارد. Doconut از پخش مستقیم فایل‌ها از ذخیره‌ساز ابری (AWS S3، Azure Blob Storage) بدون دانلود کامل فایل به دیسک محلی وب‌سرور پشتیبانی می‌کند.

این برای مقیاس‌پذیری ذخیره‌سازی به‌صورت مستقل از محاسبه حیاتی است.

  • Hot Storage (Local NVMe): برای کش موقت کاشی‌های فعال سند استفاده شود.
  • Cool Storage (S3 Standard): برای اسنادی که به‌صورت مکرر دسترسی دارند.
  • Cold Storage (S3 Glacier): برای بایگانی‌ها.

APIهای مبتنی بر Stream Doconut به شما اجازه می‌دهند داده‌ها را مستقیماً از S3 به موتور رندرینگ انتقال دهید و استفاده از حافظه را ثابت نگه می‌دارند، صرف‌نظر از اندازه فایل بر روی دیسک.

نتیجه‌گیری

مقیاس‌پذیری یک سیستم پردازش اسناد سفری است از «کار کردن» به «کار کردن به‌صورت جهانی». با پذیرش الگوی ناهمگام .NET Core، اتخاذ معماری میکروسرویس با Docker، و استفاده از استراتژی‌های هوشمند کش و صف، می‌توانید راه‌حل نمایش مبتنی بر Doconut بسازید که به میلیون‌ها کاربر مقیاس می‌یابد.

Doconut فقط یک کتابخانه نیست؛ یک مؤلفهٔ سازمانی است که برای تحمل فشارهای محیط‌های با همزمانی بالا طراحی شده است. با معماری مناسب، زیرساخت اسنادتان به یک سرویس نامرئی و بی‌حد تبدیل می‌شود به‌جای اینکه یک گره‌دار باشد.

#.NET Core#Scaling#Performance#Cloud