この記事では、Webアプリケーションの代表的な処理モデルについて書く。
[ イベントキュー ] → [ イベントループ ] → [ 実行 ]
メリット
デメリット
[ プロセス ]
├─ スレッド1(リクエストA)
├─ スレッド2(リクエストB)
└─ ...
メリット
デメリット
[ リクエストA ] → [ プロセス1 ]
[ リクエストB ] → [ プロセス2 ]
メリット
デメリット
言語 | 処理モデル | IOバウンド | CPUバウンド | 備考 |
---|---|---|---|---|
Node.js | イベントループ(非同期) | ◎ | △ | IO特化、重い計算処理は注意 |
Go | goroutine + M:Nスレッド | ◎ | ◎ | 軽量スレッドで並列・並行処理が得意 |
Ruby(MRI) | スレッド+GIL(制限あり) | ○ | △ | GILによりCPU処理は実質シングルスレッド |
PHP(FPM) | プロセス(1リクエスト=1プロセス) | ○ | △ | プロセス分離で安定だがオーバーヘッド大 |
Java | マルチスレッド | ◎ | ◎ | JVMレベルでのスレッド最適化 |
Python(CPython) | スレッド+GIL(制限あり) | ○ | △ | RubyのMRIと同様にGILの制約あり |
各処理モデルには一長一短があり、アプリケーションの特性や要件に応じて適切なモデルを選択することが重要である。IOバウンドな処理が多い場合はイベントループモデル、CPUバウンドな処理が多い場合はスレッドモデルやプロセスモデルが適していると考えられる。また、言語ごとの特性も考慮すると良い。