我想沒有哪兩個HTTP請求可以在精確的同一時間來到了服務器, 所有請求通過管道來讓他們將在隊列中。
這部分基本上是正確的。傳入連接進入事件隊列,其中一個必須先放入隊列中。
如果兩個請求在同一時間到達兩臺服務器, 服務器如何處理這種情況呢?
由於服務器正在一個進程中偵聽單個套接字上的傳入TCP連接,因此在同一時間不能有兩個傳入連接。一個將由底層操作系統在另一個之前稍微處理。這樣想想吧。傳入連接是通過網絡連接的一組數據包。其中一個傳入連接的數據包將在另一個之前。
即使您有多個網卡和多個網絡鏈接,因此兩個傳入連接可能會在同一時刻實際到達服務器,但node.js隊列將通過類似互斥的守護程序和其中一個傳入的連接將先於另一個獲取互斥體並將其放入事件隊列中。
由OS首先處理的一個將被放入node.js事件隊列之前的另一個。當節點。js可用於處理事件隊列中的下一個項目,那麼無論哪個傳入請求首先在事件隊列中首先開始處理。
由於node.js JS執行是單線程的,處理該請求的代碼將運行其同步代碼以完成。如果它有一個異步操作,那麼它將啓動該異步操作並返回。這將允許處理事件隊列中的下一個項目,並且第二個請求的代碼將開始運行。它將運行它的同步完成。與第一個請求一樣,如果它有一個異步操作,那麼它將啓動該異步操作並返回。
在這兩個請求已經開始他們的異步操作,然後返回後,那麼它剛好到事件隊列。當其中一個異步操作完成時,它會將另一個事件發送到事件隊列,並且當node.js的單個線程空閒時,它將再次處理事件隊列中的下一個項目。如果這兩個請求都有很多異步操作,則它們的進度可能會交錯,並且兩者都可能在進行異步操作時處於「正在進行中」狀態,然後返回,直到異步操作完成,並且node.js處於再次處理狀態自由處理下一個事件。
請求的時間戳包含在它的頭中,它們可能是 根據它們在頭中的時間戳推送到事件循環。
這部分不是很對。當隊列到達時,相同類型的入局事件將被添加到隊列中。首先到達隊列首先 - 沒有任何步驟檢查某個時間戳。
服務器可以同時連接到多個插座嗎??如果可以同時有多個請求 –
@AkhileshKumar - 我還沒有調查多個網卡的所有可能性,但您可以有多個監聽器,每個在不同的網卡上,但都在同一個node.js進程中。 – jfriend00