scala programming akka



Contesto e Dispatcher di esecuzione: best practice, configurazioni utili e documentazione (1)

Scala Execution Context and Dispatchers - Elenco e confronto: perché?

Ci sono molte domande su cosa / come / qual è il miglior Execution Context da utilizzare per eseguire i futures su Scala e come configurare il dispatcher. Ancora non sono mai riuscito a trovare una lista più lunga con pro e contro e esempi di configurazione.

Il meglio che ho trovato è stato nella documentazione di Akka: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html e Play Documentation https://www.playframework.com/documentation/2.5.x / ThreadPools .

Vorrei chiedere quali configurazioni oltre alle impostazioni predefinite scala.concurrent.ExecutionContext.Implicits.global e Akka utilizzate nelle vostre vite Dev quotidiane, quando le utilizzate e quali sono i pro e i contro.

Ecco alcuni di quelli che ho già:

Prima panoramica incompleta

Standard: scala.concurrent.ExecutionContext.Implicits.global

Test - ExecutionContext.fromExecutor(new ForkJoinPool(1))

  • utilizzare per il test
  • nessun parallelismo

Play default EC - play.api.libs.concurrent.Execution.Implicits._

Contesto di esecuzione predefinito di Akka

bulkheading

ExecutionContext.fromExecutor(new ForkJoinPool(n)) based on an separated dispatcher . Thanks to Sergiy Prydatchenko

Idealmente con il solo codice non bloccante si dovrebbe semplicemente utilizzare il contesto di esecuzione dei framework. Gioca a Frameworks o Akka's.

Ma a volte devi usare le API di blocco. In un progetto Play Framework e JDBC, abbiamo seguito la loro raccomandazione [1] e impostato il contesto di esecuzione per avere 100 thread, e usato il default ovunque. Quel sistema era molto veloce per il suo uso e le sue esigenze.

In un diverso progetto Akka in cui avevamo un mix di codice di blocco e non bloccante, avevamo dispatcher separati configurati per le diverse funzionalità. Come "blocking-dispatcher", "important-feature-dispatcher" e "default-dispatcher". Questo ha funzionato bene, ma era più complesso di un dispatcher, dovevamo sapere / indovinare / monitorare quanto ne era necessario. Carichiamo il test e scopriamo che a 1 thread era troppo lento, se avessimo 5 thread era meglio, ma dopo 10 thread non è diventato più veloce. Quindi lo abbiamo lasciato a 10 thread. Alla fine abbiamo rifattorizzato il nostro codice di blocco e spostato tutto al valore predefinito.

Ma ogni caso d'uso è diverso, devi profilare e monitorare il tuo sistema per sapere che cosa è giusto per te. Se hai tutti i codici non bloccanti è facile, dovrebbe essere 1 thread per core della CPU.

[1] https://www.playframework.com/documentation/2.5.x/ThreadPools#Highly-synchronous





spray