Quando NON è buono usare gli attori in akka / erlang?

53

Ho lavorato con akka per 7-8 mesi ora ogni giorno. Quando ho iniziato, avrei lavorato sulle applicazioni e ho notato che gli attori sarebbero stati usati praticamente ovunque nel sistema degli attori per comunicare tra la maggior parte degli oggetti. Così ho fatto lo stesso: creare un altro attore per x / y / z.

Mi sembra che questo possa essere troppo indiscriminato, aggiungendo complessità laddove non è necessario - ma non riesco a trovare alcuna discussione su dove gli attori contro la logica sincrona o persino asincrona attraverso i futures dovrebbero essere usati. Ho iniziato a meditare sulla mia posizione dopo che il mio collega ha menzionato qualcosa di simile. Recentemente ho realizzato diversi casi in cui ho riflettuto su un compito e poi ho evitato di creare un altro attore perché potevo ottenere lo stesso risultato in modo sicuro in un'implementazione immutabile, ad esempio ottenere valori di configurazione da un db o da qualche file dove si accede molto raramente e attendi che il risultato sia il caso d'uso effettivo.

In particolare, mi sembra che in ogni caso in cui stai giocando con uno stato immutabile, gli attori creano complessità e limitano il throughput - una pura funzione in un oggetto, per esempio, può essere chiamata contemporaneamente senza alcun rischio con qualsiasi livello di concorrenza, tuttavia un attore può elaborare solo un messaggio alla volta. La considerazione alternativa è che dovrai parcheggiare la discussione se devi aspettare il risultato a meno che non inizi a utilizzare i futures, ma casi in cui non devi preoccuparti della messaggistica asincrona o della scala sembra che possa essere eccessivo assumere un attore.

Quindi la mia domanda è - c'è un brutto momento per usare gli attori? Sono curioso di sapere come appare e mi piacerebbe davvero l'intuizione altrui. O se ci sono alcuni principi sull'uso degli attori.

    
posta JasonG 27.09.2013 - 21:16
fonte

5 risposte

21

Vale la pena considerare quale sia il modello dell'attore utilizzato: il modello dell'attore è

  1. un modello di concorrenza
  2. che evita l'accesso simultaneo allo stato mutabile
  3. utilizzando meccanismi di comunicazione asincroni per fornire la concorrenza.

Questo è utile perché l'utilizzo dello stato condiviso da più thread diventa molto difficile, specialmente quando ci sono relazioni tra diversi componenti dello stato condiviso che devono essere mantenuti sincronizzati. Tuttavia, se disponi di componenti di dominio in cui:

  • Non autorizzi la concorrenza, OPPURE
  • Non è consentito lo stato mutabile (come nella programmazione funzionale), OPPURE
  • Devi fare affidamento su un meccanismo di comunicazione sincrono,

quindi il modello dell'attore non fornirà molti (se nessuno) benefici.

Spero che ti aiuti.

    
risposta data 28.09.2013 - 22:14
fonte
20

Questa è una domanda a cui sono interessato e ho fatto qualche ricerca su. Per altri punti di vista, consulta questo post sul blog di Noel Walsh oppure questa domanda on Overflow dello stack. Ho alcune opinioni che vorrei offrire:

  • Penso che Akka, perché funzioni con i messaggi, incoraggi una "spinta mentale". Spesso, per concorrenza, direi che questo non è quello che vuoi. Pull è molto più sicuro. Ad esempio, uno schema comune per i sistemi distribuiti consiste nell'avere una serie di lavoratori che elaborano le informazioni in una coda . Ovviamente questo è possibile in Akka ma non sembra necessariamente sii per prima cosa le persone provano . Akka offre anche cassette postali durevoli ma di nuovo dipende da come le usi - una singola coda condivisa è molto più flessibile rispetto alle code di lavoro per il bilanciamento / riassegnazione del lavoro.
  • È facile entrare nella mentalità di sostituire le tue lezioni con gli attori. In effetti alcune persone sembrano addirittura sostenerlo dicendo gli attori dovrebbero fare solo una cosa . Alla sua logica conclusione ciò aumenta la complessità del codice come descrive Jason, perché se ogni classe è un attore, ci sono molti messaggi extra e blocchi di ricezione / invio. Rende anche più difficile capire e testare il codice perché si perde la formalità delle interfacce - e non sono convinto che i commenti sono una soluzione a questo . Nonostante la efficienza leggendaria di Akka , sospetto che la proliferazione degli attori non sia una buona idea prestazioni saggio - quando usiamo thread Java sappiamo che sono preziosi e li conserviamo di conseguenza.
  • È legato al punto precedente, ma un altro fastidio è la perdita di informazioni di tipo che Noel e Pino evidenziano, come per molti di noi è per questo che stiamo usando Scala piuttosto che altri linguaggi come Python. Ci sono alcuni modi per aggirare questo problema, ma sono non standard , non raccomandato o sperimentale .
  • Infine la concorrenza, anche se hai un " lasciarlo andare in crash " il mindset, è difficile. I modelli di programmazione alternativi possono aiutare ma non risolvono i problemi: li cambiano, ecco perché è bello pensa formalmente . È anche il motivo per cui lo sviluppatore di Joe Media raggiunge strumenti già pronti come i database RabbitMQ, Storm, Hadoop, Spark, Kafka o NoSQL. Akka ha alcuni strumenti e componenti predefiniti, il che è bello, ma sembra anche di livello piuttosto basso, quindi elementi comuni di sistemi distribuiti più pronti dovrebbero aiutare gli sviluppatori e garantire che i sistemi siano costruiti correttamente.

Come Jason, sono desideroso di ascoltare l'intuizione delle altre persone qui. Come posso risolvere alcuni dei problemi sopra riportati e usare Akka meglio?

    
risposta data 11.02.2014 - 03:32
fonte
12

La tua intuizione è corretta, IMHO. Usare gli attori ovunque è come avere il martello proverbiale e vedere solo le unghie.

La migliore pratica di Erlang è quella di utilizzare processi / attori per tutte le attività che si verificano contemporaneamente. Cioè, proprio come nella vita reale. A volte è difficile trovare la giusta granularità, ma la maggior parte delle volte basta sapere guardando il dominio modellato e usando un po 'di buon senso. Temo di non avere un metodo migliore di quello, ma spero che aiuti.

    
risposta data 27.09.2013 - 22:59
fonte
0

Nell'ordine di messaggistica di input / output:

Recentemente mi sono imbattuto in un'applicazione basata su akka in cui il modello dell'attore causava effettivamente problemi di concorrenza, un modello più semplice sarebbe stato meglio sotto carico.

Il problema era che i messaggi in arrivo si muovevano in "corsie" diverse (attraverso percorsi diversi dell'attore) ma il codice presupponeva che i messaggi arrivassero alla loro destinazione finale nello stesso ordine in cui arrivavano. Finché i dati sono arrivati con intervalli sufficientemente ampi, ciò ha funzionato perché ci sarebbe stato un solo messaggio in conflitto diretto verso la destinazione. Quando gli intervalli sono diminuiti, hanno iniziato ad arrivare fuori ordine e causare un comportamento strano.

Il problema potrebbe essere risolto correttamente con un po 'meno attori, ma è un errore facile da fare quando li usi eccessivamente.

    
risposta data 06.06.2017 - 00:23
fonte
-1

Secondo me ci sono due casi d'uso per gli attori. Risorse condivise come porte e simili e stato grande. Il primo è stato trattato bene dalla discussione fino ad ora, ma lo stato grande è anche un valido motivo.

Una grande struttura passata con ogni chiamata di procedura può utilizzare un sacco di stack. Questo stato può essere inserito in un processo separato, la struttura sostituita da un id di processo e quel processo viene interrogato come richiesto.

I database come mnesia possono essere pensati come uno stato di memorizzazione esternamente al processo di interrogazione.

    
risposta data 02.04.2016 - 02:25
fonte

Leggi altre domande sui tag