2015-03-04 8 views
8

Da quello che ho raccolto, il modello "chiedi" è considerato una cattiva pratica e dovrebbe essere evitato. Invece, il modello raccomandato è il modello "attore per richiesta". Tuttavia, questo non ha senso per me, poiché lo schema "chiedi" fa esattamente questo: crea un attore leggero per richiesta. Quindi, perché questo è considerato negativo, specialmente quando i futures sono molto più componibili e sono in grado di gestire più elegantemente le regole di confronto di più mittenti/destinatari?Perché l'attore "chiede" un pattern considerato anti-pattern o "odore di codice?"

+5

Potete fornire qualsiasi riferimento a dove questo è raccomandato? È più difficile creare un caso per/contro qualcosa quando non si è sicuri di cosa sia. Inoltre, tale riferimento potrebbe contenere il ragionamento per cui si tratta di un anti-pattern che dovrebbe essere espanso o confutato. –

+1

Penso di aver trovato qualcosa di simile in [Effective Akka] (https://books.google.de/books?id=Wf5sAAAAQBAJ&pg=PP3&dq=Effective+Akka&hl=de&sa=X&ei=lGn3VM_CHKPlywPf5IDwAw&redir_esc=y#v=onepage&q= Effettivo% 20Akka & f = falso) libro di Jamie Allen, vedi capitolo 2 sezione * Il modello extra * e sottosezioni * Il problema * e * Evitare Chiedi *. Il ragionamento sembra essere che 'ask' utilizza risorse non necessarie, dal momento che un' PromiseActorRef' viene creato dietro le quinte per chiamata 'ask'. L'esempio nel libro usa multiple 'ask's e lo ottimizza in un singolo attore * per richiesta *. – PermaFrost

+0

Parte del problema è che se si sta richiedendo da un attore a un altro e si ottiene un futuro, si potrebbe finire per chiudere lo stato mutabile quando si elabora quella richiamata Future. Evitando ask, e quindi Futures, elimini queste situazioni. – cmbaxter

risposta

8

Da Akka docs:

"Non ci sono inerenti le prestazioni nell'uso chiedere poiché qualcosa deve per tenere traccia di quando il tempo è scaduto, ci deve essere qualcosa che ponti una promessa in un ActorRef e deve anche essere raggiungibile tramite il servizio remoto, quindi preferisci sempre dire per le prestazioni e solo se lo devi chiedere al numero . "

Ma a volte si desidera inviare un messaggio dall'esterno di un attore, nel qual caso è possibile utilizzare ask. L'utilizzo di ask garantisce che si ottiene una risposta entro il timeout specificato e, a volte, questo è ciò che si desidera. Tuttavia, quando si utilizza lo schema ask, è consigliabile porsi una domanda se si possa semplicemente utilizzare Future s.

C'è un posto per ask ma dovrebbe avere un uso molto limitato a causa dei motivi di cui sopra.

Non è necessario utilizzare l'attore per richiesta. Alcuni attori sono pensati per essere vissuti a lungo e altri no. Se un attore esegue un'operazione potenzialmente pericolosa o bloccante, è possibile crearne uno per richiesta. Qualunque sia la tua logica applicativa.

Problemi correlati