2017-12-19 9 views
1

最近、私は自分で俳優をラップして、ActorRefを扱うときに失うタイプセーフティを少し取り戻すことができたことがわかりました。 問題は、最後に、特定のメッセージを送信する必要があるだけでなく、期待される結果に応答する必要があるということです。 私はPromiseを含む俳優にメッセージを送って、結果を最終的に報告できると考えました。Akka俳優:askパターンvs Promise

これは悪い考えですか?それは私にきれいに見える...タイプセーフであり、ちょうど良いとして動作します。なぜ誰もそのアイデアを持っていないのですか?私が気づいていないことが何か間違っていますか?

は何も悪いことはありませんパターンベースのソリューション

case class GetUser(id:Long) 

(actorRef ! GetUser(1l)).mapTo[User] 

class UserRepoActor extends Actor{ 
    def receive={ 
    case GetUser(id)=> 
    sender() ! getUser(id) 
    } 

    ... 
} 

約束ベースのソリューション

case class GetUser(id: Long, resp: Promise[User]) 

val req = GetUser(1l,Promise()) 
actorRef ! req 
req.resp.future // No casting!! 

class UserRepoActor extends Actor{ 
    def receive={ 
    case GetUser(id,resp)=> 
    response.success(getUser(id)) 
    } 

    ... 
} 
+0

約束を含む俳優にメッセージを送信することはどういう意味ですか?いずれにしても、着信メッセージに対してパターンマッチングを行う必要があります。いくつかのコードサンプルを投稿できますか? – sparkr

答えて

0

をお願いします。非常に近いアプローチが唯一の違いでakka typedに使用される:使い捨てActorRef[T]は、分散アクター・システムでは機能しませんPromise[T]

1

Promise Sの代わりに送信されています。

少なくとも、それ以上の努力なしに。

0

質問パターンは間違いなく良いです。

1)アクターは、状態を共有せず、メッセージを介して外部世界とやりとりすることになっています。約束を果たすことはそう約束ベースのアプローチは、単純な例で動作し、実際に再起動

の場合には俳優の作成者(例えば、約束)ブレイクの俳優のライフサイクルにステートフルオブジェクトを渡す変異共有変数 )です。しかし、それをちょうど使用すると、おそらく、akkaのような複雑なものは必要ありません。

+0

完全に真実ではありません。ソリューションが複雑になればなるほど、タイプセーフの利用が増えます。結局のところ、約束ベースのソリューションは、タイプセーフティーを追加するためだけにあります。分散システムを使用したいと思うなら、約束ベースのソリューションは失敗し、Akkaは実際に同様の方法でいくつかのタイプセーフティーを追加しようと努力しているという、他の2つの提案されたソリューションを得ています。 – caeus

+0

ステートフルなオブジェクトをアクターに渡すことで、akka APIの不都合が回避できますが、akkaイデオロギーに違反します。私の視点から見ると、それはより大きな悪です。分散システムの場合だけでなく、私が指摘したように。 – simpadjo

関連する問題