簡體   English   中英

node.js 集群模塊如何允許多個子進程監聽同一個端口?

[英]How does node.js cluster module allow multiple child process to listen on the same port?

使用 Node.JS 和cluster模塊。

我試圖了解多個分叉子進程如何在同一個端口上偵聽。

例如,使用cluster模塊我們可以這樣做:

const port = 443;
...
if (cluster.isMaster) {
    for(let i = 0; i < numCPUs; i++)
    {
        cluster.fork();
    }
...
}
else // Forked child processes:
{
... 
    https.createServer({
        key: fs.readFileSync('server.key'),
        cert: fs.readFileSync('server.cert')
    }, app)
    .listen(port, () => {
        console.log(`HTTPS Listening on port ${port}`);
    });

}

此代碼派生多個進程,所有進程都在同一端口上調用listen 我不清楚所有進程如何綁定同一個端口並且仍然能夠確定哪個進程獲取端口流量。 這實際上是一種錯覺,而是主進程實際上是唯一一個綁定端口並將請求隨機傳遞給分叉子進程的進程? (如果是這種情況,是不是對性能有影響?)

感謝您幫助我了解所有子進程如何同時偵聽同一端口。

請注意,此示例在 Windows 機器上運行,但如果我理解正確,它與 Windows 和 Linux 兼容。

來自文檔集群:它是如何工作的

cluster 模塊支持兩種分配傳入連接的方法。

第一個(也是除 Windows 之外的所有平台上的默認方法)是循環方法,其中主進程偵聽端口,接受新連接並以循環方式將它們分配給工作程序,其中一些內置-in smarts 以避免使工作進程過載。

第二種方法是主進程創建偵聽套接字並將其發送給感興趣的工作人員。 然后工作人員直接接受傳入的連接。

“頂級”進程是綁定端口的進程。 IPC 通道自動分配給子進程。 “工人可以共享 TCP 連接”。

另一個重要部分是server.listen()exclusive屬性。

如果exclusivefalse (默認),則集群工作者將使用相同的底層句柄,允許共享連接處理職責。 exclusivetrue ,句柄不共享,並且嘗試共享端口會導致錯誤。 下面顯示了一個偵聽獨占端口的示例。

因此,如果您告訴它們是exclusive ,您可以讓它們都嘗試(但失敗)綁定到同一個端口,但默認情況下(這就是您的示例中的情況),它們共享句柄,允許分配連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM