2016-04-14 61 views
0

在等待響應時,Web客戶端將被阻塞,但服務器上不會阻塞任何內容,並且服務器資源可用於爲其他客戶端提供服務。在不阻塞客戶端的情況下運行長阻塞任務的框架

某些客戶端請求需要我的服務器執行長阻塞任務。我明白我可以在單獨的線程池中執行它們。
但我也不希望客戶端被阻止。我只想返回給客戶端的即時響應(例如,確定了你的長時間阻塞任務)。客戶端並不在乎如何獲得任務執行的結果,而只需要知道我正在執行它。

如何在遊戲中實現這種行爲?

我想我可以創建一個作業隊列並使用另一個線程來處理作業隊列。播放控制器只將作業添加到隊列中,另一個線程從隊列中執行作業。我應該這樣做嗎?我應該使用阿卡演員嗎? (我不知道我阿卡需要學習它)

回答

1

回調

這一切都開始回調。

您一定看到了這一點:

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頻道收到的每個消息都將被演員接收 - 你可以專注於您的商業邏輯,而不用考慮周圍的環境,然後發回消息 - 阿卡擅長的。