2012-09-28 85 views
6

Play ha sido descrito como un marco "reactivo", que es útil para la programación asincrónica. Me gustaría saber más sobre la arquitectura de la obra, principalmente:play thread architecture

  • ¿Tiene un bucle de evento?

  • ¿Tiene muchos sistemas de akka actor? ¿Están respaldados por una serie de grupos de hilos?

  • Si es así cuántos grupos de subprocesos hay y cuáles son los objetivos (enrutamiento, Tratamiento de la petición, la promesa redentora, anorm, etc.)

  • Cuál es el hilo de ejecución que estamos bien para bloquear (¿Dónde podemos hacer algunos cálculos costosos)? ¿Cuál es el hilo de ejecución que nunca deberíamos bloquear?

Cualquier recurso/wiki/consejo sobre esto es realmente útil. Gracias

Respuesta

7

Nota: el siguiente contenido se aplica a Play! 2.1.x. ¡Para jugar! 2.0.4 ver la respuesta de nico_ekito.

Las interacciones con un cliente se pueden resumir en la siguiente tabla: controlador HTTP

Play!’s architecture

de Juego (construido en la cima de Netty) vive en su propio contexto de ejecución. Cuando recibe una solicitud, intenta encontrar el punto de entrada de la aplicación para llamar de acuerdo con la URL (usando el archivo conf/routes de la aplicación). En este punto, solo los encabezados de la solicitud HTTP se cargan en la memoria.

A continuación, se llama al punto de entrada. Por lo general, es action, que carga el cuerpo restante, si lo hay. Esto sucede en un contexto de ejecución diferente, el Play! Contexto de ejecución de "usuario", definido como un despachador de actores Akka que se puede configurar en el archivo conf/application.conf de las aplicaciones.

Finalmente, dentro de una acción puede realizar llamadas asíncronas (por ejemplo, para llamar a Web Service). Todas estas llamadas asincrónicas usan la API Future de Scala, por lo que usan el contexto de ejecución disponible en el alcance en el sitio de la llamada. ¡Entonces puedes usar Play! Contexto de ejecución de "usuario" (definido en play.api.libs.concurrent.Execution.defaultContext).

En resumen, ¡juega! utiliza contextos de ejecución distintos para las siguientes tareas:

  • recibir solicitudes (controlador Netty HTTP);
  • acciones de llamada (contexto de ejecución de "usuario").

Y puede usar cualquier contexto de ejecución que desee para sus cálculos asincrónicos (incluido el contexto de ejecución "usuario" Play!).

La idea es que todos los códigos de usuario usen por defecto el juego Play! Contexto de ejecución de "usuario". Si lo bloquea, no podrá ejecutar más código de usuario, pero puede continuar haciendo todo lo demás.

Si realiza cálculos expansivos, le sugiero que utilice un contexto de ejecución dedicado.

+0

Gracias @Julien. Entonces, ¿el contexto de ejecución del usuario (que es el predeterminado) puede ajustarse en 'application.conf'? ¿Cuál es su configuración predeterminada? –

+0

El nombre del operador es 'play', puede configurarlo como cualquier [asignador de Akka] (http://doc.akka.io/docs/akka/2.1.0-RC1/scala/dispatchers.html) –

1

Eche un vistazo a la configuración predeterminada de Akka y la lista de actores en the Play! wiki.