Akka を使用して着信タスクを処理するシステムを実装するシナリオを考えてみましょう。タスクを受け取り、タスクを処理するいくつかのワーカー アクターにディスパッチするプライマリ アクターがあります。
私の最初の本能は、ディスパッチャーが受信タスクごとにアクターを作成するようにすることで、これを実装することです。ワーカー アクターがタスクを処理した後、停止します。
これは、「1 つのタスク、1 つのアクター」の原則に準拠しているため、私にとって最もクリーンなソリューションのようです。もう 1 つの解決策は、アクターを再利用することですが、これには、クリーンアップといくつかのプール管理が非常に複雑になります。
Akka のアクターが安いことは知っています。しかし、アクターの繰り返しの作成と削除に関連する固有のコストがあるかどうか疑問に思っています。Akka がアクターの簿記に使用するデータ構造に関連する隠れたコストはありますか?
負荷は、1 秒あたり数十または数百のタスクのオーダーである必要があります。これは、要求ごとに 1 つのアクターを作成する実稼働 Web サーバーと考えてください。
もちろん、正しい答えは、入ってくる負荷のタイプに基づいたシステムのプロファイリングと微調整にあります。しかし、誰かが自分の経験から何かを教えてくれませんか?
後で編集:
当面のタスクについて、さらに詳しく説明する必要があります。
- ある時点で実行できるアクティブなタスクは N 個だけです。@drexinが指摘したように、これはルーターを使用して簡単に解決できます。ただし、タスクの実行は、単純に実行して完了するタイプのものではありません。
- タスクは、他のアクターまたはサービスからの情報を必要とする場合があるため、待機してスリープ状態になる必要がある場合があります。そうすることで、実行スロットを解放します。スロットは、現在実行する機会がある別の待機中のアクターによって取得できます。プロセスが 1 つの CPU でスケジュールされる方法に例えることができます。
- 各ワーカー アクターは、タスクの実行に関して何らかの状態を維持する必要があります。
注:私の問題に対する別の解決策を高く評価しており、それらを考慮に入れます。ただし、Akka でのアクターの集中的な作成と削除に関する主な質問への回答もお願いします。