2012-02-04 2 views
8

Najlepsza odpowiedź jest w sekcji komentarzy (więc nie mogę dać im punktów za odpowiedź :().jest playframework naprawdę asynchroniczny?

Zastanawiam się, czy Playframework był asynchroniczny w ten sposób (który byłby naprawdę asynchroniczny, lub w pełni asynchroniczny) Tak, gra jest asynchroniczna z przodu, umożliwiając 1000 klientów na 100 wątkach, ale na zapleczu, nie ma sposobu, aby to osiągnąć, lub jestem w błędzie (co mam nadzieję być) .....

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); 
    } 
} 

UWAGA: może to być ekstremalnie asynchroniczne zachowanie, a także pamiętać, że jeśli masz system zaplecza, który zajmuje kilka sekund, aby odpowiedzieć na każde żądanie, potrzebujesz teraz około 100 mniej komputerów, aby obsługiwać tę samą liczbę użytkowników. normalne konteksty, w których system zaplecza jest bardzo szybki, oczywiście nie byłoby różnicy w wydajności.

Dzięki, Dean

+3

Czy znasz ten http://www.playframework.org/documentation/1.2.4/asynchronous? Zwłaszcza rzeczy o Obietnicach. To może być również interesujące: http://caffeinelab.net/2010/06/29/asynchronous-http-client-in-play-framework/ – nylund

+0

OK, to było niesamowite, opublikuj jako odpowiedź .... drugie łącze jest niezwykle jasne !!!! wspaniała odpowiedź !!!! (jak to się stało, że nie mogę oznaczać komentarzy jako poprawnej odpowiedzi :(). –

+0

hmmm, ten przykład pokazuje Future, która nie ma możliwości dodania słuchacza, więc gra musi być sondą na przyszłość i pytając, czy dzieje się, jest w kółko ???? Ten rodzaj cuchów ... dlaczego po prostu nie użyć wątku odpowiedzi, aby powiadomić o grze, która następnie wywołałaby po raz drugi metodę kontrolera? –

Odpowiedz

6

Wystarczy popatrzeć na Play 2.0. Wciąż jest to wersja beta, ale ma numer some nice asynchronous stuff.

Po raz pierwszy zapoznaj się z this documentation page, która obejmuje asynchroniczne funkcje Play i Play Akka module (i podczas gry również Akka itself :)).

+0

PYTANIE: Mówi, że zawiesza operacja ... co to oznacza? Jeśli wysyłam żądanie nio, mogę od razu odesłać obietnicę i wysłać ją do oczekującej metody ... czy robi ona magię kodu bajtowego, aby następnie powrócić do stosu wywołań i kiedy przywołuję obiekt obietnicy z odpowiedzią, to kontynuuje? Widziałem, że i jeśli tak, to cholernie słodko, że można napisać kod synchroniczny i staje się on asynchroniczny. –

+0

Udaliśmy się do gry 2.0 i było to NAJNOWSZE, wolniejsze tempo rozwoju niż wirtualna gra 1.2.x. Ostatecznie przywróciliśmy cały kod scala 2.0 z powrotem do kodu Java 1.2.x. (Robimy jak scala, ale nawet poprawki do stronicowania html spowodowały całą rekompilację, która była naprawdę denerwująca). –

+0

Po wykonaniu tego samego żądania na różnych kartach w tej samej przeglądarce wydaje się, że są one synchroniczne. – Rafael

1

Odtwarzanie 2 jest całkowicie asynchroniczne od zera i używa akka i netty. Możesz używać gry zarówno dla Twojego frontonu, jak i usług (np .: jako reszta). Gra jest również bezpaństwowa, więc bardzo łatwo jest ją skalować, dodając serwery.

+0

więcej szczegółów byłoby świetnie na tym chociaż ..... jest jak wyżej. Czy jest na tym dokument? –

+0

tutaj jest wideo z dni scala wyjaśniające zachowanie asynchroniczne http://days2011.scala-lang.org/node/138/296 Również ten dokument jest dobrym źródłem https://github.com/playframework/Play20/wiki/ScalaHome – sirmak

0

Dodanie tutaj niektórych szczegółów. Wygląda na to, że Play wymyślił coś, co nazywa się obiektem Obietnicy, który rozszerza Future i ma sposób na dodanie słuchacza, więc zakładam, że gra dodaje słuchacza w obiekcie Obietnicy zaraz po wysłaniu zapytania i kiedy twój wątek odpowiedzi wywołuje Promise.setResponse (xxx), ta metoda sprawdzi, czy detektor został jeszcze dodany, a jeśli tak, to wywoła detektora, aby powiedzieć mu, że odpowiedź została odebrana, a odtwarzanie zostanie zrzucone w kolejce do przetworzenia na wątkach.

JEŻELI twoja odpowiedź bije ramy gry, dodając jej słuchacza, gdy odtwarza połączenia addListener, jestem "zakładając", że ma kod do tej kontroli była już ustawiona reakcja na obiekcie, a jeśli tak, wywołaj słuchacza za pomocą playframeworks istniejącego wątku, który spada to w kolejce do playframeworka (a przynajmniej mam taką nadzieję).

Nie wiem, czy obietnica została przeniesiona z powrotem do gry 1.2.x, jednak jako przykład wykorzystano Przyszłość, w której gra musiałaby przeprowadzić ankietę, aby zobaczyć, kiedy odpowiedź powróci ... ick .... zawsze zastanawiałem się, dlaczego nie było addResponseListener na tych obiektach Future ... nigdy nie lubiłem tego.