最佳答案在评论部分(所以我无法给出答案点数:()。
我想知道playframework是否以这种方式异步(这将是真正异步或完全异步)。是的,前端的play是异步的,允许100个线程上的1000个客户端,但是在后端,没有办法实现这一点,或者我错了(我希望是这样).......
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);
}
}
注意这将是极端异步行为,并且还要注意,如果您的后端系统需要几秒钟来响应每个请求,那么现在需要大约100台机器来为相同数量的用户提供服务。在后端系统速度非常快的正常环境中,当然没有性能差异。
感谢, 迪安
答案 0 :(得分:6)
看看Play 2.0。它仍然是测试版,但它有some nice asynchronous stuff。
对于第一个Play,请查看this documentation page,其中包含Play的异步功能,以及Play Akka module(当您还在使用Akka itself :)时。
答案 1 :(得分:1)
播放2完全是异步的,它使用了akka和netty。您可以将游戏用于您的前端和服务(例如:作为休息)。播放也是无状态的,因此,通过添加服务器来扩展它非常容易。
答案 2 :(得分:0)
在此处添加一些细节。它确实看起来像Play发明了一个名为Promise对象的东西,它扩展了Future,并且有一种方法可以添加一个监听器,所以我假设play在你发送请求后立即在Promise对象上添加一个监听器,当你的响应线程调用Promise.setResponse(xxx)时),该方法将检查是否已添加监听器,如果是,则调用监听器告诉play接收到响应,然后播放将其转储到队列中以便在其线程上进行处理。
然而,如果你的响应比播放框架添加它的监听器,当播放调用addListener时,我“假设”它有代码检查已经在对象上设置了响应,如果是,则使用playframeworks现有线程调用监听器在playframework的队列中(或者至少我希望是这样)。
我不知道Promise是否被移植回1.2.x但是因为这个例子使用的是一个未来的游戏必须进行轮询以查看响应何时回来... ick ....我总是想知道为什么这些Future对象上没有addResponseListener ......从不喜欢它。