scala concurrency playframework akka spray

scala - Contexto de ejecución y despachador: mejores prácticas, configuraciones útiles y documentación



concurrency playframework (1)

Contexto de ejecución de Scala y despachadores - Listado y comparación: ¿Por qué?

Hay muchas preguntas sobre qué / cómo / cuál es el mejor Execution Context para usar para ejecutar futuros en Scala y cómo configurar el despachador. Aún así, nunca pude encontrar una lista más larga con pros y contras y ejemplos de configuración.

Lo mejor que pude encontrar fue en la documentación de Akka: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html y Play Documentation https://www.playframework.com/documentation/2.5.x / ThreadPools .

Me gustaría preguntar qué configuraciones además de scala.concurrent.ExecutionContext.Implicits.global y los valores predeterminados de Akka se usan en sus vidas cotidianas de revelador, cuando los usa y cuáles son los pros y los contras.

Estos son algunos de los que ya tengo:

Primera visión general sin terminar

Estándar: scala.concurrent.ExecutionContext.Implicits.global

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

  • usar para probar
  • sin paralelismo

EC predeterminado del juego - play.api.libs.concurrent.Execution.Implicits._

Contexto de ejecución por defecto de Akka

Bulkheading

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


Idealmente, con solo código sin bloqueo, simplemente usaría el contexto de ejecución de marcos. Juega Frameworks o Akka''s.

Pero a veces tienes que usar API de bloqueo. En un proyecto de Play Framework y JDBC, seguimos su recomendación [1] y configuramos el contexto de ejecución para tener 100 hilos, y simplemente usamos el predeterminado en todas partes. Ese sistema fue muy rápido para su uso y necesidades.

En un proyecto Akka diferente donde teníamos una combinación de código de bloqueo y no bloqueo, teníamos despachadores separados configurados para las diferentes funciones. Como "bloqueador-despachador", "importante-feature-dispatcher" y "default-dispatcher". Esto funcionó bien, pero era más complejo que tener 1 despachador, teníamos que saber / adivinar / controlar cuánto necesitaban cada uno. Cargamos la prueba y descubrimos que a 1 hilo era demasiado lento, si teníamos 5 hilos, era mejor, pero después de 10 hilos no conseguía nada más rápido. Entonces lo dejamos en 10 hilos. Finalmente, modificamos nuestro código de bloqueo y lo cambiamos todo a los valores predeterminados.

Pero cada caso de uso es diferente, necesita un perfil y monitorear su sistema para saber cuál es el adecuado para usted. Si tiene todo el código que no bloquea es fácil, debe ser de 1 hilo por núcleo de CPU.

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