ドキュメント処理のスケーリング (.NET Core 使用)
← Back to Blog1 min read

ドキュメント処理のスケーリング (.NET Core 使用)

アプリケーションがパイロットプロジェクトからエンタープライズ規模のプラットフォームへと成長するにつれて、インフラストラクチャへの要求は劇的に変化します。ドキュメント処理―閲覧、変換、OCR―は計算負荷が高いです。10 人のユーザーに対しては完璧に機能するソリューションでも、1 万人の同時ユーザーに直面すると止まってしまうことがあります。

高負荷システムの世界では、スケーラビリティが王です。開発者はトラフィックのスパイクを優雅に処理し、リソースを効率的に管理し、コストを予測可能に保つアーキテクチャが必要です。ここで .NET Core の改善されたパフォーマンスプロファイルと Doconut のスケーラブルなアーキテクチャの組み合わせが光ります。本記事では、.NET Core と Doconut を効果的に活用してドキュメント処理パイプラインをスケールさせる戦略を探ります。

ドキュメント処理のパフォーマンス特性

効果的にスケールするためには、まずワークロードを理解しなければなりません。ドキュメント処理は、同時に3つの主要なリソース制約すべてに束縛されることが多いため、特異です:

  1. CPU Bound: 複雑なベクタPDFのレンダリングやCAD図面の変換には、膨大な計算が必要です。
  2. Memory Bound: 500 MB の高解像度マップをメモリにロードして処理するには大きなヒープが必要で、ガベージコレクタ(GC)に負荷がかかります。
  3. I/O Bound: ディスクやクラウドから大きなソースファイルを読み取り、キャッシュされたタイルを書き込むことは、かなりの入出力操作を伴います。

このようにスケールするには、モダンな .NET Core ランタイムの強みを活かした多面的なアプローチが必要です。

ストラテジー 1: 非同期 I/O (Async/Await) の力

レガシーな .NET アプリケーションはしばしばスレッドプールの枯渇に悩まされました。ファイルのディスク読み込みを待つ間に Web リクエストがスレッドをブロックすると、サーバーは新規リクエストを処理するスレッドが不足し、CPU がアイドル状態でも 503 エラーが発生します。

Doconut は .NET Core で利用可能な Async/Await パターンに完全に最適化されています。すべての I/O 操作―ソースファイルの読み取り、ライセンスの取得、キャッシュへの書き込み―は非同期で行うべきです。

ビューコントローラーが最上位から async メソッドを使用していることを保証すれば、単一サーバーインスタンスで何千もの同時接続を処理でき、スレッドをブロックせずに I/O 完了を効率的に待機できます。

ストラテジー 2: 分散キャッシュ

単一サーバー構成では、メモリ内 (IMemoryCache) にレンダリング済みページをキャッシュするのは高速で簡単です。しかし、スケールアウトした環境(Web ファーム)では失敗します。ユーザー A がサーバー 1 にアクセスするとページはそこにキャッシュされますが、次のリクエストがサーバー 2 に割り振られるとページは再レンダリングされ、CPU が無駄になります。

スケーラブルなドキュメント処理のためには Distributed Caching を実装する必要があります。Doconut はカスタムキャッシュプロバイダーの作成をサポートしています。Redis や SQL Server のキャッシュプロバイダーを実装すれば、ページのレンダリングという負荷の高い作業が正確に一度だけ行われます。

  • Scenario: ユーザーが "AnnualReport.pdf" のページ 1 をリクエスト。
  • Server 1: Redis をチェック。見つからない。ページをレンダリング。タイルを Redis に保存。画像を返す。
  • Server 2 (別ユーザー対応中): Redis をチェック。見つかった!画像を即座に返す。

これにより CPU 負荷が大幅に軽減され、どのノードがリクエストを処理してもスムーズな体験が保証されます。

ストラテジー 3: インテリジェント階層ストレージ

何百万ものドキュメントを保管するには賢いストレージ戦略が必要です。Doconut はクラウドストレージ(AWS S3、Azure Blob Storage)からファイルを直接ストリームし、Web サーバーのローカルディスクに全体をダウンロードすることなく処理できます

これはコンピュートとは独立してストレージをスケールさせる上で重要です。

  • Hot Storage (Local NVMe): アクティブなドキュメントタイルの一時キャッシュに使用。
  • Cool Storage (S3 Standard): 頻繁にアクセスされるドキュメント向け。
  • Cold Storage (S3 Glacier): アーカイブ用。

Doconut の Stream ベース API により、S3 からデータを直接レンダリングエンジンにパイプでき、ディスク上のファイルサイズに関係なくメモリ使用量が一定に保たれます

結論

ドキュメント処理システムのスケーリングは「動かす」から「普遍的に動かす」への旅です。.NET Core の非同期パラダイムを受け入れ、Docker を用いたマイクロサービスアーキテクチャを採用し、スマートなキャッシュとキューイング戦略を活用すれば、数百万ユーザーにスケールする Doconut パワードの閲覧ソリューション を構築できます。

Doconut は単なるライブラリではなく、高同時実行環境の厳しい要件に耐えるエンタープライズコンポーネントです。適切なアーキテクチャを備えれば、ドキュメントインフラはボトルネックではなく、見えない無限のユーティリティへと変貌します。

#.NET Core#Scaling#Performance#Cloud