Uno dei vantaggi dei modelli di elaborazione dei messaggi come attori e agenti è che i tradizionali problemi di concorrenza (principalmente la sincronizzazione dello stato condiviso) non sono più un problema. L'attore può mantenere uno stato privato e aggiornarlo liberamente senza blocchi. Il framework dell'attore garantisce che venga elaborato un solo messaggio alla volta. Con l'elaborazione serializzata, il codice può essere scritto in modalità lock-free.
Nel tuo esempio di utenti che salvano un modulo, supponendo che l'attore stia mantenendo un elenco di alcuni dati da ciascun modulo, l'attore può aggiornare l'elenco senza blocchi, poiché la struttura garantisce che solo un modulo verrà elaborato alla volta. Tradizionalmente, dovresti bloccare gli accessi alla lista o utilizzare un elenco simultaneo.
La strategia della concorrenza è leggermente diversa ed è ancora sotto la tua responsabilità (senza strategia che sia la strategia più comune). Per cambiare leggermente il tuo esempio, supponiamo che entrambi gli utenti tentino di aggiornare l'istanza del modulo SAME allo stesso tempo. Senza una strategia di concorrenza, le proprie modifiche sovrascriveranno l'altra (probabilmente l'ultima vince). Va bene, ma nella migliore delle ipotesi ciò comporta un comportamento imprevisto per l'utente le cui modifiche sono state sovrascritte. Se visualizzano il modulo appena modificato, avranno valori inattesi (dall'altro utente). Nel peggiore dei casi (quando non stiamo parlando solo di aggiornamenti dei moduli, ma di cose come ordini di spedizione) ciò potrebbe comportare perdite di vario tipo (tempo, entrate, ecc.).
L'utilizzo di una strategia di concorrenza aiuta a identificare questi casi ed è in grado di risolverli in base alle regole aziendali. Ad esempio, Optimistic Concurrency ha l'utente di inviare la versione del modulo che sta aggiornando. Quando l'attore va a elaborare la modifica, nota che il secondo utente pensa di aggiornare la Versione 5 quando il modulo è in realtà nella Versione 6 a causa dell'aggiornamento del primo utente. Ora almeno possiamo comunicare al 2 ° utente che il modulo è già cambiato da quando hanno iniziato a modificarlo. O quali sono le regole che l'azienda vuole imporre qui.
Nel caso di aggiornamento di un modulo, probabilmente non ti interessa tanto sulla concorrenza (dipende, suppongo). Ma in altri casi, potrebbe essere una cosa molto importante essere almeno in grado di controllare e gestire le violazioni. Potresti anche voler ignorare la violazione della concorrenza, come se gli utenti avessero cambiato sezioni diverse (per continuare l'analogia del modulo). O se la modifica ha un grande impatto sul business (un grande ordine), vuoi accettarlo e risolvere i conflitti minori in seguito (ad esempio, l'aggiornamento annuale delle informazioni di contatto non è stato completato).
Credo che Akka abbia una serie di altre dimensioni come il modo in cui gestisce i fallimenti, i supervisori, ecc. che sono considerazioni importanti per gli sviluppatori.