これに対する万能の答えはありません
- 大きなタスクAを多くの小さな部分(A¹、A²、A³、…)に分割すると、潜在的な同時実行性が向上します。
したがって、10個のワーカースレッド/プロセスを持つ1個のワーカーインスタンスがある場合、Aは、1つのスレッドで順次実行するのではなく、10個のスレッドを使用して並列で実行できるようになりました。
パーツの数は、タスクの粒度(細粒度または粗粒度)と呼ばれます。
- タスクの粒度が細かすぎると、メッセージングのオーバーヘッドによってパフォーマンスが低下します。
各部分には、タスクメッセージをブローカーに送信するオーバーヘッドを相殺するのに十分な計算/ IOが必要です。タスクメッセージを受け取るワーカー、メッセージを受信するワーカーなどがない場合は、ディスクに書き込む可能性があります(メッセージングに注意してください)。オーバーヘッドを微調整することができます。たとえば、一時的なキュー(メッセージをディスクに永続化しない)を作成し、そこでそれほど重要ではないタスクを送信することができます。
- 忙しいクラスターは、このすべてを無意味にする可能性があります
ビジーなクラスターがある場合(たとえば、それぞれ10個のスレッド/プロセスを持つ3つのワーカーインスタンス、すべて実行中のタスク)、最大の並列処理がすでに達成されている可能性があります。
その場合、タスクを分割しても多くのメリットは得られませんが、I / Oを実行するタスクは、CPUバウンドタスク(I / O操作によって分割される)よりも改善される可能性が高くなります。
労働者は、10分または1時間の長時間実行タスクにアレルギーがありません。
ただし、長時間実行されるタスクは、そのスロットが待機中のタスクを完了するのをブロックするため、理想的でもありません。この人々を軽減するために、ルーティングを使用して、できるだけ早く実行する必要があるタスク用の専用ワーカーを備えた専用キューを用意します。
-