2011-09-02 15 views
6

Cosa succede a messaggi di posta non letti in Scala attori? Ad esempio due casi: 1. Se

dimenticare di implementare reagire caso per il messaggio speciale:

actor!NoReactCaseMessage

2. Se i messaggi arriva troppo veloce:

(timeOfProcessingMessage > timeOfMessageComes)

Se prima o seconda caso accade, sarebbe accatastato in memoria?Scala, attori, cosa succede ai messaggi in arrivo non letti?

EDIT 1 Esiste un meccanismo per vedere questo tipo di perdita di memoria che sta accadendo? Forse, controlla il numero di messaggi non letti, quindi crea un po 'di garbage collector o aumenta il pool di attori. Come ottenere il numero di messaggi non letti? In che modo questo tipo di perdite di memoria sono state risolte in altre lingue? Ad esempio in Erlang?

risposta

8

la cassetta postale è una coda - se non sta tirando i messaggi dalla coda (vale a dire se la funzione parziale nel vostro react o receive ciclo torna false per isDefinedAt), poi i messaggi semplicemente rimanere lì.

In senso stretto si tratta di una perdita di memoria (della vostra applicazione), sebbene la sua gravità dipenda da come questi messaggi non letti crescono di numero (ovviamente). Ad esempio, utilizzo spesso attori per fondere una query di riproduzione e un "live stream" di messaggi entrambi identificati da un numero di sequenza. La mia reazione è simile al seguente:

var lastSeq = 0L 
loop { 
    react { 
    case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data) 
    } 
} 

Questo contiene una perdita di memoria, ma non un "serio" uno, come ci sarà un limite superiore del numero di messaggi duplicati (cioè non ci può essere una volta di più il replay la query è finita).

Tuttavia, questo può ancora essere un disturbo, poiché per ciascuna reazione, il sottosistema degli attori eseguirà nuovamente la scansione dei messaggi per vedere se possono essere elaborati.

In effetti, pensare a una vera e propria casella di postapotrebbe essere una buona analogia qui. Immagina di aver lasciato tutta la tua posta indesiderata lì dentro: molto presto, staresti soffrendo per la fame a causa di tutta la posta indesiderata che avresti dovuto setacciare per ottenere l'estratto conto della carta di credito.

3

Come questo tipo di perdite di memoria sono state risolte in altre lingue? Ad esempio in Erlang?

Uguale a Scala. Prima edizione:

  1. Se dimenticate di implementare reagire caso per il messaggio speciale

È molto raramente bisogno di lasciare un messaggio nella casella di posta intenzionalmente e ricevere in un secondo momento. Non ho mai incontrato una situazione del genere. Quindi puoi sempre includere una clausola catch-all (case _ => ... in Scala), che non farà nulla, registrerà un avviso o genererà un'eccezione, qualunque cosa abbia più senso nella tua situazione.

  1. Se i messaggi arriva troppo veloce

Invece di inviare messaggi direttamente a un processo che non li può gestire abbastanza velocemente, aggiungere un processo di buffering. Può buttare via messaggi extra, inviarli a più di un processo di lavoro, ecc.

Problemi correlati