2

私は Scala と Akka を同時に学ぼうとしていますが、それは素晴らしいことですが、少し混乱することもあります。質問が断片化して申し訳ありません。

アクターモデルはわかります。アクターがいて、メッセージを送受信し、受信したメッセージを保存するメールボックスがあり、メールボックスがメッセージに優先順位を付けることができ、すべてが混乱します。

私はたくさんの本を読んできましたが、読めば読むほど混乱するので、誰かが混乱のレベルを許容可能な最小値まで減らすための助けを提供してくれることを願っています. ポインタは大歓迎ですが、すべてをまとめるにはちょっとした接着剤の説明が必要かもしれません。基本的には RTFM の助けになります。

質問は次のとおりです。

  1. 受信トレイでメッセージを並べ替えるにはどうすればよいですか? 「暗黙の」(順序付けられたメールボックスで) について読んだことがありますが、それは魔法のように聞こえます。ソートされたメールボックスはインターフェイスを実装する型のみを受け入れると思ってComparableいましたが、ここで Scala は関数型パラダイムを使用し、ordering間違っていなければ関数を受け入れますOrdering[T]。ただし、順序付け関数 (? で動作) は、同等のオブジェクトに制限される可能性があるため、 ?Tに戻ります。Comparable
  2. メールボックスを共有する可能性はありますか?
  3. ここでバスの実装を使用する必要がありますか? バスの仕分けはできますか?
  4. とは何implicit abstract defですか? abstract実装する必要がある ( ) が、実装する必要がない( )メソッドのように見えますがimplicit、矛盾しているように聞こえます。(これは の定義ですSortedSet)
  5. を定義する必要がありますDispatcherか? それがアーキテクチャ全体でどのように一致するかを理解できませんでした。しかし、私はプールを探し続け、代わりにディスパッチャーを見つけています。
  6. sについて読むべきFutureですか?読み取りとプログラミングのループで、概念を徐々に把握するための小さな実装を作成しようとしています。たくさんの質問を重ねて申し訳ありません。

私がこれまで考えてきた解決策は次のとおりです。

  1. 通信の中心ノードであるアクターを持つ。
  2. この中央のアクターは、アクターSortedSetのプールにディスパッチされるメッセージがエンキューされる場所を保持します
  3. この中心的なアクターは、Set無料のアクターも保持します。
  4. アクターが解放されると (メッセージを処理した後)、解放されたアクターは中央のアクターにメッセージを送信して、何らかの作業を行うように求めます。
  5. 中央のアクターがメッセージを処理します。
    1. 保留中の作業がある場合は、処理が必要なメッセージをデキューします。
    2. やるべき仕事がない場合、フリーエージェントへの参照が保存され、彼に仕事が送られます。
  6. 中央のアクターは、メッセージをジョブ タスクと同様に処理します。
    1. フリー アクターが存在する場合、ジョブはフリー アクターに送信されます。
    2. フリー アクターがいない場合、ジョブは に追加されSortedSetます。
  7. アクターのプールは、アクターを作成し、すべての参照を中央マネージャーに送信するだけで作成されます。

ScalaもAkkaもよく知らないので、この解決策を考えました。しかし、私はこの種のソリューションにいつまでもとらわれたくありません。基本的にアクターは何でもできますが、私はそれらを適切に使用し、メールボックス、バス、プール、ディスパッチャー、フューチャーなどの他のすべての要素を適切に使用したいと考えています.

どうもありがとうございました。

4

1 に答える 1

2
  • 1 & 2 & 5: ディスパッチャーに関する Akka のドキュメントでは、ディスパッチャーとは何か、ディスパッチャーの定義方法と使用方法についてかなり詳しく説明されています。また、メールボックス、独自の潜在的に優先順位の高いメールボックスを定義する方法、および複数のアクターが単一のメールボックスを共有する方法についても説明しています: http://doc.akka.io/docs/akka/2.1.4/java/dispatchers.html

  • 3: EventBusAkka のデフォルトである AFAIK では、メッセージの並べ替えが許可されていません

  • 4:であるメソッドをimplicit abstract def定義します。暗黙的メンバーと抽象メンバーは直交する概念であるため、ここで矛盾はありません。おそらく、暗黙的な変換を定義し、その実装をサブクラスに委譲したいと思うでしょう。abstractimplicit

  • 6: はい、Future は Akka だけでなく、Scala の同時実行性全般にとって重要な部分です。

特定の設計上の問題に関しては、より簡単な解決策はルーターを使用することです。ルーターは、受信メッセージをポリシーに従って登録されたルートにディスパッチする特別なアクターです。

http://doc.akka.io/docs/akka/2.1.4/scala/routing.html

あなたの場合、中心的なアクターをルーターに置き換えます。メッセージに優先順位を付ける必要がある場合は、そのルーターに優先メールボックスを構成できます。

あなたが説明している動作に近づくルーターはSmallestMailboxRouterになります。

メッセージを蓄積する中心的なアクターを使用する必要があると判断した場合は、このアクターの監督に関して細心の注意を払ってください。デフォルトでは、失敗したアクターは再起動されるためSortedSet、メッセージを保持する が失われる可能性があります。これは、カスタマイズされたメールボックスを使用するもう 1 つの理由です。アクターの状態をメッセージ順序付けセマンティクスから分離します。

于 2013-06-06T09:08:53.863 に答える