Stop using ForkJoin for web application

Stop using ForkJoin for web application

# ForkJoin ?

ここで言う ForkJoin とは、非同期タスクを以下のように処理するシステム:

- CPU コア数以下のスレッドを持ち
- スレッドごとのタスクキューを持ち
- work stealing する

具体的には [ForkJoinPool (JVM)](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html) とか。

標準機能・ライブラリに ForkJoin 相当がない言語でも、
本稿の考え方自体は適用できることがあるだろう。
( 例えば node.js のようなイベントドリブンでも近い話はあるので )

# TL;DR

一時期の流行の影響があり騙されてしまうケースがあるが...

- ForkJoin、オメーは駄目だ (ほとんどの web アプリ用途では)
- 大抵の web アプリ用途では長所が活きない
- スレッド数が足りない
- `fairness` がないので、レイテンシの最悪値が青天井
- web アプリの並列処理では普通のスレッドプール + キューキングがベターなことが多い
- CPU コア数に関係なく単一のキューを使うのがポイント

※ web アプリ用途: 画面・API のレスポンスを返すまでの処理の中で並列処理をする用途の意

なお、CPU・メモリアクセス律速かつバッチ処理などでは ForkJoin 方式は有用 (例えば AI のミニバッチとか向いてそう、たぶん)。

1a18bf1e50d7d2bdfe52a6c9fceec244?s=128

saiya_moebius

February 21, 2019
Tweet