Я получаю смешанную информацию о том, как устроена игра 2. На сайте написано, что он построен на акке, что, скорее всего, означает, что он использует актера для каждого соединения? В нем также говорится не писать блокирующий код, потому что он предотвращает запуск других событий в разных соединениях (вроде того, как он блокирует цикл событий в node.js). Как это может быть, если код блокировки в одном акторе не блокирует код в другом акторе? Разве не в этом смысл использования актеров вместо обратных вызовов, таких как node.js?
Как каждое соединение обрабатывается в play framework 2?
Ответы (1)
Когда они говорят, что Play построен поверх Akka, они имеют в виду фреймворк, а не веб-сервер. Соединения обрабатываются JBoss Netty (http://netty.io/), который является встроенным веб-сервером.
Соединения могут быть привязаны (или нет) к актеру Akka для предоставления асинхронного ответа, как описано здесь: http://www.playframework.com/documentation/2.1.0/JavaAkka
Связь между акторами не блокируется, потому что они отправляют сообщения (любой объект) и не ждут ответа (они не вызывают методы для связи с другим актором).
Логика похожа на эту:
//somewhere in the code
ActorB.tell(new Request(...));
-----------------------------------------
ActorB:
public void onReceive(Object msg) throws Exception {
if (msg instanceof Request) {
//process the request
ActorA.tell(new Response(...))
}
}
----------------------------------------------------------------
ActorA:
//ActorA is notified
public void onReceive(Object msg) throws Exception {
if (msg instanceof Response) {
System.out.println("Response: " + msg)
}
}
Метод tell() отправляет сообщение и не ждет ответа.
person
TizianoPiccardi
schedule
05.03.2013