2016-11-13 48 views
1

昨天我在nodeJS上做了一些介紹。 有些人問我以下問題:可以將兩個http請求放在一起嗎?如果可以,nodeJS服務器如何處理它?

正如我們所知是的NodeJS一個單線程的服務器,幾個請求 來的服務器,並推動所有請求事件循環。如果 兩個請求同時到達服務器,服務器將如何處理這個情況? ?

我猜中的思想和回答後下載:

我猜沒有兩個HTTP請求可以在完全相同的 時間前來服務器,所有的請求,通過一個單一的插槽來讓他們將排隊。 HTTP 請求具有以下格式:

httpPctFormt

的請求時間戳被包含在它的報頭,並且它們可以被推向取決於其在報頭的時間戳的事件循環。

但我不確定我是否給他正確或錯誤的答案。

回答

3

我想沒有哪兩個HTTP請求可以在精確的同一時間來到了服務器, 所有請求通過管道來讓他們將在隊列中。

這部分基本上是正確的。傳入連接進入事件隊列,其中一個必須先放入隊列中。

如果兩個請求在同一時間到達兩臺服務器, 服務器如何處理這種情況呢?

由於服務器正在一個進程中偵聽單個套接字上的傳入TCP連接,因此在同一時間不能有兩個傳入連接。一個將由底層操作系統在另一個之前稍微處理。這樣想想吧。傳入連接是通過網絡連接的一組數據包。其中一個傳入連接的數據包將在另一個之前。

即使您有多個網卡和多個網絡鏈接,因此兩個傳入連接可能會在同一時刻實際到達服務器,但node.js隊列將通過類似互斥的守護程序和其中一個傳入的連接將先於另一個獲取互斥體並將其放入事件隊列中。

由OS首先處理的一個將被放入node.js事件隊列之前的另一個。當節點。js可用於處理事件隊列中的下一個項目,那麼無論哪個傳入請求首先在事件隊列中首先開始處理。

由於node.js JS執行是單線程的,處理該請求的代碼將運行其同步代碼以完成。如果它有一個異步操作,那麼它將啓動該異步操作並返回。這將允許處理事件隊列中的下一個項目,並且第二個請求的代碼將開始運行。它將運行它的同步完成。與第一個請求一樣,如果它有一個異步操作,那麼它將啓動該異步操作並返回。

在這兩個請求已經開始他們的異步操作,然後返回後,那麼它剛好到事件隊列。當其中一個異步操作完成時,它會將另一個事件發送到事件隊列,並且當node.js的單個線程空閒時,它將再次處理事件隊列中的下一個項目。如果這兩個請求都有很多異步操作,則它們的進度可能會交錯,並且兩者都可能在進行異步操作時處於「正在進行中」狀態,然後返回,直到異步操作完成,並且node.js處於再次處理狀態自由處理下一個事件。

請求的時間戳包含在它的頭中,它們可能是 根據它們在頭中的時間戳推送到事件循環。

這部分不是很對。當隊列到達時,相同類型的入局事件將被添加到隊列中。首先到達隊列首先 - 沒有任何步驟檢查某個時間戳。

+0

服務器可以同時連接到多個插座嗎??如果可以同時有多個請求 –

+0

@AkhileshKumar - 我還沒有調查多個網卡的所有可能性,但您可以有多個監聽器,每個在不同的網卡上,但都在同一個node.js進程中。 – jfriend00

1

多個併發HTTP請求不成問題。 Node.js是異步的,並且將在事件循環中處理多個請求,而不必等待每個請求完成。

作爲參考,例如:https://stackoverflow.com/a/34857298/1157037

+1

但是,您必須補充說,您需要避免長時間同步任務。在處理請求期間,不包括執行異步IO操作,服務器無法處理更多請求。我們必須照顧這一點。 –

相關問題