2017-12-19 8 views
1

In letzter Zeit habe ich mich Schauspieler in Klassen wickeln, so dass ich ein wenig von der Typsicherheit zurück, die ich im Umgang mit ActorRef s. Das Problem ist, am Ende, dass ich nicht nur eine bestimmte Nachricht senden muss, muss ich auch die Antwort auf das erwartete Ergebnis zu werfen. Also ich dachte, dass ich Nachrichten an Akteure senden könnte, die Promise enthalten, so dass sie das Ergebnis schließlich melden könnten.Akka Schauspieler: frage Muster vs Promise

Ist das eine schlechte Idee? Es sieht mir ziemlich gut aus ... Ist typsicher und funktioniert genauso gut. Warum ist niemand mit der Idee gekommen? Ist irgendetwas falsch daran, das ich nicht bemerkt habe?

stellen Muster-basierte Lösung

case class GetUser(id:Long) 

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

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

    ... 
} 

Versprechen basierte Lösung

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

Was meinst du damit, Nachrichten an Schauspieler zu senden, die Versprechen enthalten? In jedem Fall müssen Sie eine Übereinstimmung für die eingehende Nachricht erstellen. Können Sie einige Codebeispiele posten? – sparkr

Antwort

0

Es ist nichts falsch. Ganz in der Nähe Ansatz ist in akka typed mit dem einzigen Unterschied verwendet: eine Einweg- ActorRef[T] wird statt Promise[T]

1

Promise s nicht in verteilten Schauspielern System arbeitet gesendet.

Zumindest ohne zusätzliche Anstrengungen dafür.

0

Ask Muster ist definitiv besser.

1) Akteure sollen keinen Zustand teilen und über Nachrichten mit der Außenwelt interagieren. das Versprechen erfüllen, ist eigentlich eine gemeinsame Variable mutiert

2) die Stateful-Objekte in Schauspieler des Erstellers Passing (z Versprechen) Umbrüche Schauspieler Lebenszyklus bei Neustarts

So versprechen basierten Ansatz in einfachen Fällen funktioniert. Aber wenn du es einfach so verwendest, brauchst du wahrscheinlich keine so komplizierten Sachen wie Akka?

+0

Nicht ganz richtig. Je komplexer eine Lösung ist, desto mehr kann sie die Typsicherheit nutzen. Am Ende sind die Versprechen-Basis-Lösungen nur dazu da, Typsicherheit hinzuzufügen. Ich komme zu den anderen beiden Lösungsvorschlägen, dass, wenn ich verteilte Systeme verwenden möchte, eine auf Versprechen basierende Lösung fehlschlagen wird, und dass Akka tatsächlich bemüht ist, einige Arten von Sicherheit auf ähnliche Weise hinzuzufügen. – caeus

+0

Indem Sie ein statusbehaftetes Objekt an einen Akteur übergeben, umgehen Sie die Unannehmlichkeiten der akka-API, verletzen aber die akka-Ideologie. Aus meiner Sicht ist es ein größeres Übel. Nicht nur bei verteilten Systemen, wie ich schon sagte. – simpadjo

Verwandte Themen