2014-07-02 114 views
2

我有一個node.js項目,它有一個async::queue,由App::add()填充。異步處理節點中的HTTP請求

這是我用它來創建服務器的代碼:

app = new App config 
server = http.createServer (req, res) -> 
    app.add req, res, (err) -> 
    res.headers = 'Content-Type': 'application/json' 
    res.end JSON.stringify error: err 
.listen config.port 

App::add()req採取paramters,並增加了一個任務到隊列,回調。 該隊列處理的功能是結束end。如果發生錯誤,它將發給用戶。

到目前爲止工作正常。但是,當並行執行多個請求時,只處理一個請求。

我嘗試:

  • console.loghttp.createServer -callback的端部和它被立即調用,但下一個請求僅結束後先處理。
  • 一個console.logApp::add()開始,同上

如何處理的併發請求?

在此先感謝。

編輯:

要清除一些東西,這就是我想要的:

  1. 許多許多客戶要求的服務來下載一個ZIP
  2. 他們在隊列中排隊, n正在處理中
  3. 每個人都可以在他們的郵編完成後立即收到他們的郵編

編輯2:

我試圖用cluster module,但是這沒有太大的幫助,因爲我必須結束res反正。

編輯3:

我試圖不關閉返回一個流,但沒有成功,無論是。 我有點絕望,也許我只是把人轉發到另一臺服務器,他們可以下載他們的文件。

+0

你可以使用WebSockets。在初始請求之後加載頁面,然後在隊列的每個回調中將數據發送到頁面。只要確保你沒有阻塞隊列的事件循環,並使用'process.nextTick()'。 –

+0

你如何返回數據?如何以什麼格式。 –

+0

作爲應用程序/ JSON,可能是zip文件或錯誤。 – user3797089

回答

1

NodeJS與您的瀏覽器中的javascript一樣,是單線程的。這意味着它一次只能處理一個連續的代碼塊。在你的例子中(因爲你沒有爲你的隊列處理提供代碼,所以我認爲傳遞的函數是實際的處理代碼)。由於它沒有任何I/O(這意味着它不會阻止等待來自外部源的文件系統或數據庫),所以在nodejs可以開始處理另一個事件之前,函數的邏輯必須完全完成。

如果您需要更多的細節,這是第一個環節我GOOGLE瞭如何在的NodeJS併發環境工程:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

+0

這對我來說沒有意義。我知道,該節點是單線程的。 http服務器在最後一個結束後接受一個新的請求(使用'res.end()',但是我無法想象沒有辦法異步處理請求 @Ben提到的Websockets是一個想法,但不是理想 – user3797089

+0

你需要給你的應用程序代碼和客戶端代碼提供更多的上下文,在你的基本代碼段中沒有問題。 – Dmitry