3

私は最近、Akka 2.0 フレームワークの調査を開始し、いくつかのコードを実行し、単純な oracle データベース呼び出しを実行し、単純な計算などを実行するアクターを生成することができましたが、本番環境では何も実行していません。

私が知りたいのは、特定のタイプのタスクに対してスポーンするアクターの数を決定するための一般的な経験則またはベスト プラクティスはありますか? たとえば、200 個の jdbc 接続の接続プールがあるとします。各接続を表すアクターを作成しますか? それらを少数作成し、ラウンド ロビン アプローチを使用しますか?

ありがとう。

4

2 に答える 2

8

numberOf(actors) != numberOf(threads) であることに注意してください。

スレッド間で変更可能な状態を共有するエンティティごとにアクターを作成する必要があります。アクター モデルに関するすべてのことは、不変のメッセージのみがアクター間で交換されるように、可変状態を分離する必要があるということです。その結果、ロックが不要になり、プログラムのスレッド セーフについて簡単に推論できます。これは、変更可能なすべての状態がアクターで分離され、フレームワークに依存して、必要なときにいつでもメモリ バリアを適切に渡すことができるためです。アクターをあるスレッドから別のスレッドに切り替える。

スレッドの数は別の問題です。これは、コアの数と各スレッドのブロッキング係数 (つまり、他のスレッドまたは I/O サブシステムの待機に費やす時間の割合) によって異なります。たとえば、アクターが CPU を集中的に使用する計算 (Pi の計算など) を行っている場合、ブロッキング係数は 0% に近くなります。ただし、アクターが主に I/O を実行している場合は、ブロッキング係数が 90% 以上であると簡単に想定できます。

最後に、スレッド数は次のように計算できます。

int threads = Runtime.getRuntime().availableProcessors() * 100 / (100 - blockingCoefficient)

ここで、blockingCoefficient は 0 から 99 までの整数のパーセンテージを表します。

于 2012-06-04T12:26:01.947 に答える
4

好きなだけアクターを作成できますが、親ごとに約 20 億に制限されています。また、アクターが完了したら停止することを忘れないでください。また、実際にトップレベルのアクターでない限り、アクターをトップレベルとして作成しないでください。(つまり、system.actorOf の代わりに context.actorOf を使用してアクター内にアクターを作成します)

于 2012-06-04T11:50:51.083 に答える