3

私は Akka から始めたばかりで、いくつかの厄介な機能をより管理しやすい部分に分割しようとしています。それぞれの機能は別のアクターによって実行されます。

私のタスクは、まさにアクター モデルに適しているようです。データベースに保存されているオブジェクトのツリーがあります。各ノードにはいくつかの属性があります。1つだけに集中して、それを富と呼びましょう。子供の資産は、親の資産に依存します。ノードで富を計算すると、子ノードでも同様の計算がトリガーされます。更新されたノードのインスタンスをすべて収集し、同時に DB に保存したいと考えています。

これは簡単に思えます: アクターは計算を実行し、現在のノードの各子に対して別のアクターを開始します。すべての子が計算結果を含むメッセージを送り返すと、アクターはそれらを収集し、現在のノードを追加して、上位のアクターにメッセージを送信します。

問題は、すべての子供たちからメッセージを受け取ったことを確認する方法がわからないことです。簡単な方法は、カウンターを使用して、子供からのメッセージが到着するたびにそれを増やすことです。

しかし、システムの 2 つの独立した部分がそのような計算を実行する必要があり、同じアクターが再利用された場合はどうなるでしょうか? アクターは 2 倍の数の子をスポーンし、カウントは信頼できなくなります。必要なのは、同じアクターが外部システムから再利用されないようにすることですが、計算がトリガーされるたびに新しいアクターが生成されます。

これは可能ですか?そうでない場合、Akka には、すべての子がそのタスクを実行したことを確認するための自動メカニズムがありますか?

ここでは不適切な状況でアクター モデルを使用しているだけですか? 基本的に、関数でできること以外は何もしていません。アクター自体はステートレスですが、計算を単純化し、並列化することができます。

4

1 に答える 1

3

あなたが物事を説明する方法は、Future [Tree [NodeWealth]]を返す再帰関数だと思います。関数は呼び出されるたびにFutureを生成し、階層内の各子に対してそれ自体を呼び出します、関数の最後に、それらの呼び出しから単一の Future[Result] への Future を構成します。再帰関数が終了して Future[Tree[NodeWealth]] を返すと、DB を更新する別の Future でそれを構成できます。Futures に関するAkka のドキュメントを参照してください。そして、「先物を構成する」セクションに特に注意してください。

先物の構成により、状態を回避し、これを簡単に実装できるようになります。

もう 1 つのオプションは、アクターと先物を使用し、子アクターで ask パターンを使用して、結果の先物を単一の先物に構成し、送信者 (親アクター) に返すことです。これは本質的に同じことであり、俳優と絡み合っているだけです。何らかの理由でノードをアクターとしてすでに表現している場合にのみ、おそらくこのルートに進みます。

于 2012-10-10T16:50:52.533 に答える