在不阻塞客户端的情况下运行长阻塞任务的框架

问题描述:

在等待响应时,Web客户端将被阻塞,但服务器上不会阻塞任何内容,并且服务器资源可用于为其他客户端提供服务。在不阻塞客户端的情况下运行长阻塞任务的框架

某些客户端请求需要我的服务器执行长阻塞任务。我明白我可以在单独的线程池中执行它们。
但我也不希望客户端被阻止。我只想返回给客户端的即时响应(例如,确定了你的长时间阻塞任务)。客户端并不在乎如何获得任务执行的结果,而只需要知道我正在执行它。

如何在游戏中实现这种行为?

我想我可以创建一个作业队列并使用另一个线程来处理作业队列。播放控制器只将作业添加到队列中,另一个线程从队列中执行作业。我应该这样做吗?我应该使用阿卡演员吗? (我不知道我阿卡需要学习它)

回调

这一切都开始回调。

您一定看到了这一点:

Something.save(function(err) { 
    if (err) { 
    //error handling 
    return; 
    } 
    console.log('success'); 
}); 

这是在JavaScript中定义的回调 - 这是将要执行异步的东西。由于他们的语法,实现和不 - ,回调不是你的朋友。过度使用它们会导致可怕的回调地狱

承诺

在这种情况下:承诺在ES6

Something.save() 
    .then(function() { 
    console.log('success'); 
    }) 
    .catch(function() { 
    //error handling 
    }) 

承诺是不是一个“ES6-事情”,他们多年以来存在,ES6将它们带给你。承诺是不错的,你甚至可以链接他们:

saveSomething() 
    .then(updateOtherthing) 
    .then(deleteStuff) 
    .then(logResults); 

但足以与异步的疯狂。

的WebSocket

的WebSocket是我会建议:

  • 今天的very well supported
  • 在播放2.x的美妙支持
  • 全双工TCP
  • 你终于可以抽空学习阿卡;)

所以你可以创建一个客户端,它打开一个WebSocket连接到Play应用程序。在服务器端,你可以handle WebSocket connections either with Akka actors(我推荐)或者在流上使用回调。使用演员非常简单也很有趣 - 你定义了一个演员 - 当某人打开一个WebSocket连接时,这个演员的一个实例被生成,然后你在WebSocket频道收到的每个消息都将被演员接收 - 你可以专注于您的商业逻辑,而不用考虑周围的环境,然后发回消息 - 阿卡擅长的。