Ecco il mio scenario:Il metodo Akka onReceive viene eseguito contemporaneamente?
Ho un attore principale, che riceve messaggi da più attori secondari. Questi messaggi contengono dati da aggregare. In questa logica di aggregazione, devo occuparmi dei problemi di sincronizzazione, se utilizzo una struttura dati condivisa per raccogliere l'aggregazione?
else if(arg0 instanceof ReducedMsg){
ReducedMsg reduced = (ReducedMsg)arg0;
counter.decrementAndGet();
synchronized(finalResult){
finalResult.add((KeyValue<K, V>) reduced.getReduced());
if(counter.get() == 0){
if(checkAndReduce(finalResult)){
finalResult.clear();
}
else{
stop();
latch.countDown();
}
}
}
}
Quindi, come potete vedere ho una finalResult, a cui verranno aggregati ogni messaggio, e dopo una logica di elaborazione della collezione deve essere cancellato pure.
In realtà quello che sto cercando di implementare è una riduzione della mappa riduttiva (associativa). Quindi ho bisogno di mantenere il blocco sincronizzato presumo? O è per caso Akka esegue l'onReceive un thread alla volta?
Questa logica produce risultati precisi e prevedibili su un piccolo set di dati. Il mio problema è quando il mio set di dati di input è un po 'grande, il codice si blocca. Voglio essere sicuro che sia a causa degli switch di contesto per il mio blocco di sincronizzazione, in modo che possa dwelve in un design diverso.
Grazie Tomasz. La tua prima riga cancella molti dei miei dubbi! Riguardo l'uso del latch, devo farlo per fornire un'interfaccia client che dovrebbe attendere fino al completamento dell'elaborazione dell'attore. Il mio obiettivo è sviluppare un framework java, che internamente userebbe Akka/Scala per elaborare. –
@sutanudalui: puoi chiamare l'attore * in modo sincrono *, il che significa essenzialmente che Akka attenderà la risposta su qualche coda temporanea. Non c'è bisogno di farlo manualmente. Consulta i documenti di Akka sullo schema del messaggio 'ask' (al contrario di' tell'). –
Ok. Diventerò un po 'più profondo Ho un router round robin con attori N slave. Quello che intendo è fare un'elaborazione parallela e quindi accumulare il risultato. Quindi l'attore principale, al ricevimento di ogni input, si dirige verso uno degli schiavi. Gli slave, durante l'elaborazione del messaggio, lo rimettono al master che deve aggregare. Questa fase di aggregazione in cui stavo pensando ai problemi di sincronizzazione. Dal link doc fornito, vedo che Akka non può garantire (ben nessuno può indovinare!) Quella memoria condivisa, nel mio caso il "FinalResult" sarà protetto. Sto comprendendo questo correttamente? –