2012-02-04 35 views
8

Mejor respuesta se encuentra en la sección de comentarios (por lo que no les pueden dar puntos para la respuesta :().es playframework verdaderamente asincrónico?

Me preguntaba si era playframework asíncrono de esta manera (que sería verdaderamente asíncrona, o totalmente asíncrona) Sí, el juego es asincrónico en la interfaz permitiendo 1000 clientes en 100 hilos, pero en el back-end, no hay forma de lograrlo, o estoy equivocado (que espero sea) .....

public static void someRequest(String id) { 

    //This method adds listener to a nio socket listener so it returns 
    //IMMEDIATELY and page can't be rendered at this point 
    fetchRemoteDataFromOtherSystem(id, new MyListener()); 

    // DO NOT RENDER PAGE YET but return so thread can be used for other requests 
} 

public class MyListener extends SomeListener { 
    public void fireResponse(Response response) { 
     renderPage(response); 
    } 
} 

AVISO que esto sería un comportamiento asíncrono extremo y también tenga en cuenta que si tiene un sistema de fondo que tarda segundos para responder a cada solicitud, ahora necesita alrededor de 100 máquinas menos para atender a la misma cantidad de usuarios. contextos normales donde el sistema back-end es muy rápido, no habría diferencia de rendimiento, por supuesto.

gracias, Dean

+3

¿Has leído este http://www.playframework.org/documentation/1.2.4/asynchronous? Especialmente las cosas sobre Promises. Esto también puede ser de interés: http://caffeinelab.net/2010/06/29/asynchronous-http-client-in-play-framework/ – nylund

+0

bien, eso fue increíble, publícalo como la respuesta ... que el segundo enlace es extremadamente claro !!!! gran respuesta !!!! (¿cómo es que no puedo marcar los comentarios como la respuesta correcta :(). –

+0

hmmm, ese ejemplo muestra un futuro que no tiene la capacidad de agregar un oyente por lo que el juego debe estar haciendo una encuesta sobre el futuro y preguntar isDone, isDone una y otra vez? Ese tipo de hedor ... ¿por qué no usar el hilo de respuesta para notificar el juego que luego llamaría al método del controlador por segunda vez? –

Respuesta

6

Eche un vistazo a Play 2.0. Todavía es una versión beta, pero tiene some nice asynchronous stuff.

Para la primera Play, eche un vistazo a this documentation page, que cubre las características asincrónicas de Play, y Play Akka module (y mientras lo hace, también Akka itself :)).

+0

PREGUNTA: Dice que suspende la operación ... ¿qué significa eso? Si estoy haciendo una solicitud nio, puedo devolver una promesa de inmediato y enviarla al método de espera ... ¿está haciendo algo de magia de código de bytes para luego devolver la pila de llamadas y cuando invoco el objeto prometido con una respuesta, ¿continúa? Pude ver eso y, si es así, es bastante dulce que puedas escribir código síncrono y se vuelve asincrónico. –

+0

Fuimos a jugar 2.0 y fue MUCHO más lento en cuanto a productividad de desarrollo que juego 1.2.x. Eventualmente revertimos todo nuestro código scala 2.0 al código java 1.2.x. (Nos gusta Scala pero incluso los ajustes a un html paginado causaron una recompilación completa que fue realmente molesto). –

+0

Si realiza la misma solicitud en diferentes pestañas en el mismo navegador, parecen ser sincrónicas. – Rafael

1

play 2 es totalmente asincrónico desde cero y utiliza akka y netty. Puede utilizar el juego tanto para su interfaz como para los servicios (por ej .: como descanso). Además, jugar es sin estado, por lo que es muy fácil ampliarlo añadiendo servidores.

+0

más detalles sería genial en esto, aunque ..... es como el anterior. Hay un doctor en eso? –

+0

aquí hay un video de scala días que explica el comportamiento asíncrono http://days2011.scala-lang.org/node/138/296 También este documento es un buen recurso https://github.com/playframework/Play20/wiki/ScalaHome – sirmak

0

Agregando algunos detalles aquí. Parece que Play inventó algo llamado objeto Promesa que extiende Futuro y tiene una manera de agregar un oyente, así que supongo que reproducir agrega un oyente en el objeto Promesa justo después de que hayas enviado tu solicitud y cuando tu hilo de respuesta llame a Promise.setResponse (xxx), ese método verificará si el oyente se ha agregado aún y, de ser así, invocará al oyente para decirle a play que se recibió la respuesta y que la reproducción se volcará en su cola para ser procesada en sus subprocesos.

IF sin embargo, su respuesta supera a los marcos de juego agregando su oyente, cuando play calls addListener, estoy "asumiendo" que tiene código que verifica si la respuesta ya está configurada en el objeto y, si es así, llame al oyente utilizando playframeworks en la cola del playframework (o al menos espero que sea el caso).

No sé si se retrotrajo Promise para jugar 1.2.x sin embargo, como en el ejemplo se usaba un Future, el juego debería sondear para ver cuándo regresa la respuesta ... ick ... I siempre me pregunté por qué no había AddResponseListener en estos objetos Future ... nunca me gustó eso.