2015-06-04 9 views
16

Sto cercando di capire quando utilizzare Akka Futures e ho trovato this article un po 'più utile rispetto ai documenti Akka principali. Quindi sembra che Akka Futures faccia esattamente la stessa cosa di Java 7 Futures. Quindi chiedo:Akka vs Java 7 Futures

  • Fuori dal contesto di un sistema di attori, quali vantaggi ha Akka Futures rispetto a Java Futures? Quando usarli?
  • Nel contesto di un sistema di attori, perché sempre utilizza un futuro Akka? Non tutti i messaggi da attore a attore sono asincroni, concomitanti e non bloccanti?
+0

"Future" e "Promise" di Akka sono più paragonabili a "CompletableFuture" di Java. –

+0

Grazie a @SotiriosDelimanolis, ma potresti non pensare che sia come è, ma è così. – smeeb

risposta

7

Akka Futures implementa un modo di comunicazione asincrono, mentre Java7 Futures implementa un approccio sincrono. Sì, fanno la stessa cosa - comunicazione - ma in modo completamente diverso.

La coppia produttore-consumatore può interagire in due modi: sincrono e asincrono. La modalità sincrona presuppone che il consumatore abbia il proprio thread ed esegua un'operazione di blocco per ottenere il messaggio successivo, ad es. BlockingQueue.take(). Nell'approccio asincrono, il consumatore non possiede un thread, è solo un oggetto con almeno due metodi: per memorizzare un messaggio e per elaborarlo. Producer chiama il metodo store, proprio come chiama lo Queue.put(m) nell'approccio sincrono, ma questo metodo avvia anche l'esecuzione del metodo di elaborazione del consumatore su un comune pool di thread.

UPDT Per quanto riguarda la seconda domanda (perché mai utilizzare un futuro Akka): La creazione futura sembra (ed è) più semplice di quella di Actor; il codice per una catena di Futures è più compatto e più dimostrabile di quello degli attori. Nota tuttavia, un Futuro può passare solo un singolo valore (messaggio) mentre un attore può gestire una sequenza di messaggi. Ma le sequenze possono essere gestite con Akka Streams. Quindi sorge la domanda: perché mai usare gli attori Akka? Invito sviluppatori più esperti a rispondere a questa domanda. In generale, penso che se il tuo compito può essere risolto con Futures, allora usi Futures, altrimenti se con Stream, usi Stream, altrimenti se con Akka Actors, quindi usi Actors, altrimenti cerchi un altro framework.

+0

Grazie @Alexei Kaigorodov (+1) - Penso che affronti la mia prima preoccupazione, riguardo l'uso di Akka Futures * al di fuori * del contesto di un sistema di attori. Se ti capisco correttamente, dovresti usarli quando hai bisogno di un normale Java 7 Future, ma hai bisogno di un'interazione * produttore/consumatore asincrona *. ** Ma per quanto riguarda la mia seconda preoccupazione? ** Che ne dici di usare Akka Futures * all'interno * di un sistema di attori? Se la messaggistica da attore a attore è già asincrona, perché mai usare un Akka Future all'interno di un sistema di attori? Li useresti all'interno di un attore che sta comunicando con, ad esempio, un database esterno/di blocco? Grazie ancora! – smeeb

+0

Che cosa rende Java 7 Futures più sincrono rispetto ai futuri Akka? Non capisco. – flup

4

Per la prima parte della tua domanda, sono d'accordo con la risposta di Alexei Kaigorodov.

Per la seconda parte della tua domanda:

E 'utile usare un Future internamente quando le risposte attore devono essere combinati in un modo molto specifico. Ad esempio, supponiamo che l'attore Master debba eseguire numerose query di database di blocco e quindi aggregare i risultati, quindi Master invia ciascuna query a Worker e quindi aggregherà le risposte. Se i risultati della query possono essere aggregati in qualsiasi ordine (ad esempio, Master consiste nel sommare i conteggi delle righe o qualsiasi altra cosa), allora è opportuno cheinvii i risultati a Master tramite una richiamata. Tuttavia, se i risultati devono essere combinati in un ordine molto specifico, è più facile per ogni Worker restituire immediatamente uno Future e per Master per poi manipolare questi Futures nell'ordine corretto. Questo potrebbe essere fatto anche attraverso le callback, ma in tal caso, Master dovrebbe determinare quale risultato della query è quello di metterli nell'ordine corretto e sarà molto più difficile ottimizzare il codice (ad es.se i risultati di query1 possono essere immediatamente aggregati con i risultati di query2, utilizzando una Future questa logica può andare direttamente nel codice di invio in cui sono già note le identità di tutte le query, mentre l'utilizzo di una callback richiederebbe Master per identificare il risultato della query e inoltre determinare se è possibile aggregare la query con qualsiasi altro risultato di query che è stato restituito).