Ho un'applicazione Scala che sto tentando di refactare per usare Akka . Uno dei problemi che ho è come gestire il controllo degli errori nelle applicazioni basate su attori.
Di solito il controllo degli errori viene eseguito attraverso uno dei due meccanismi:
- o uno restituisce un valore che indica una condizione di errore, ad esempio
Option[A]
oFailure[A]
o - mediante l'uso di eccezioni.
Nessuno di questi stili sembra particolarmente utile qui. Da un lato, i messaggi degli attori sono solitamente "fuoco e dimentica", quindi non ci sono valori di ritorno. [Si può avere un valore di ritorno usando Futures, ma certamente non è consuetudine chiedere il futuro su ogni messaggio.] D'altra parte, l'elaborazione del messaggio di solito avviene su un altro thread, così che non si può cogliere un'eccezione derivante dall'elaborazione di un messaggio.
Si potrebbe simulare il primo meccanismo inviando messaggi di errore o di conferma, come
class FooActor extends Actor {
def receive = {
case Foo => ...
if (errorCondition) sender ! ErrorMessage
}
}
Ma se si deve fare questo per ogni attore, diventa un grosso problema e sembra una simulazione da povero dello srotolamento dello stack.
What is a good strategy to recover from errors in actor-based applications?