2015-05-05 25 views
9

Ho questo dubbio persistente riguardo all'importanza dei router Akka. Ho usato Akka Routers nell'attuale progetto a cui sto lavorando. Tuttavia, sono un po 'confuso sull'importanza di ciò. Tra i due metodi seguenti, che è più vantaggioso.Importanza di router Akka

  1. con router e percorsi.
  2. Creazione di tutti gli attori necessari.

Ho capito che il router assegnerà i messaggi in arrivo tra i suoi percorsi in base alla strategia. Inoltre, possiamo avere una strategia di supervisione basata sul router. Ho anche capito che gli attori sono anche leggeri e non è un overhead creare più attori possibili. Quindi, possiamo creare attori per ciascuno dei messaggi in arrivo e ucciderlo se necessario dopo il completamento dell'elaborazione.

Quindi voglio capire quale di questi disegni è migliore? O in altre parole, nel qual caso (1) ha vantaggio su (2) O viceversa.

risposta

11

Buona domanda. Avevo dubbi simili prima di leggere la documentazione di Akka. Ecco i motivi:

  1. efficienza. Da docs:

    sui router di superficie sembrano attori normali, ma sono in realtà implementato in modo diverso. I router sono progettati per essere estremamente efficienti alla ricezione dei messaggi e passarli rapidamente alle route .

    Un normale attore può essere utilizzato per i messaggi di routing, ma l'elaborazione di un singolo thread può diventare un collo di bottiglia. I router possono eseguire il con un throughput molto più elevato con un'ottimizzazione della solita pipeline di elaborazione dei messaggi che consente il routing simultaneo. Questo è raggiunto incorporando la logica di routing dei router direttamente nel loro ActorRef anziché nell'attore del router. I messaggi inviati a ActorRef di un router possono essere instradati immediatamente al routee, ignorando interamente l'attore del router single-thread .

    Il costo per questo è, naturalmente, che gli interni del codice di routing sono più complicati di quelli se i router fossero implementati con attori normali. Fortunatamente tutta questa complessità è invisibile ai consumatori dell'API di routing . Tuttavia, è qualcosa di cui essere a conoscenza quando si implementano i propri router .

  2. implementazione di default di molteplici strategie di routing. Puoi sempre scrivere il tuo, ma potrebbe essere complicato. È necessario tenere conto di supervisione, ripristino, bilanciamento del carico, distribuzione remota, ecc.

  3. I modelli di router Akka saranno familiari agli utenti di Akka. Se si esegue il routing personalizzato, tutti dovranno dedicare tempo a comprendere tutti i casi d'angolo e le implicazioni (+ test? :)).

TL; DR Se non ti interessa troppo l'efficienza e se è più facile per te generare nuovi attori, fallo. Altrimenti usa i router.

+0

Grazie Aleksey, per la spiegazione. Ora ho capito come un attore è diverso dal router. Ma ho ancora una confusione. In che modo i router migliorano le prestazioni, dal momento che siamo in grado di creare il numero di attori per l'elaborazione quando richiesto senza alcun sovraccarico? Immagino che i router possano portare alla tolleranza d'errore, ma a parte questo? –

+1

Creare attori è molto economico e non preoccupante. I router migliorano le prestazioni nell'instradamento dei messaggi essenzialmente inoltrando un messaggio direttamente dal client all'operatore "bypassando" l'agente di routing. Se si implementa il routing utilizzando l'attore normale, tutti i messaggi dovranno fare la coda nella propria casella di posta e essere inoltrati ai lavoratori, è un salto extra che si potrebbe voler evitare. Schematicamente: 'Client -> (AkkaRouter) -> Worker' vs' Client-> YourRouter-> Worker'. Dove '(X)' significa un salto che sarà bypassato. –

+0

Cosa succede se implemento "attori per richiesta"? In tal caso, ciascun attore gestirà una sola richiesta e potrà essere ucciso dopo di ciò? Funzionerà meglio di avere router? –