2017-02-07 45 views
0

因爲我對羣集完全陌生並且文檔沒有與我一起單擊,所以與我一起工作。Node.js羣集儘可能地處理數據

if (cluster.isMaster) 
{ 
    for (let i = 0; i < numCPUs; i++) 
    { 
    cluster.fork(); 
    } 

    for (const file in files) 
    { 
    cluster.workers.send(file); //*** 
    } 
} 
else if (cluster.isWorker) 
{ 
    process.on("message", (msg) => 
    { 
    //...Process data here... 
    }); 
} 

***是我想要的東西。像cluster.workers.send(...)向工作人員發送消息以及不忙的人會收到消息。如果所有工作人員都很忙,那麼這條消息就會等待發送,直到有一名自由工人。

+0

節點集羣將創建您的應用程序的多個實例。如果您只想讓一個羣集執行一項任務,則可以使用redis和redlock npm模塊進行使用。使用此模塊,您可以只允許一個羣集在多個羣集中執行一項任務。 –

+0

我會檢查redis和redlock,但有沒有一種方法可以實現這一點,而無需添加額外的依賴項?如果可能的話,最好不要使用太多的樣板 – Arman

回答

2

如果您需要大量的任務,並且reddit將是一個不錯的選擇,您需要一個數據庫來管理隊列,Vinay Pandya暗示。

您想要防止額外的依賴關係,您可以在集羣主進程中使用隊列數組,並將任務推送到/從該數組中移出。要確定空閒節點,您可以維護一個「節點」對象,並在完成其任務時從每個節點獲得反饋以更新它。反饋可以用process.send完成。

+0

是的你是對的,但我建議你應該使用redis而不是內存對象,因爲如果你重新啓動你的應用程序,所有的對象將會消失。所以爲了使用Redis,Redis速度如此之快,就像高速緩存一樣。 –

+0

絕對如此。對一個很好的解決方案有一點依賴性不會傷害:) –

+0

因此,我認爲我得到了我所期望的,而不是像Bulent Vural建議的那樣,通過listener和process.send使用redis,但是我意識到集羣使用的內存比我多得多將能夠承擔我的任務。您是否知道使用Redis進行羣集會節省內存?理想情況下,如果我有10 GB的JSON,我想將它存儲在內存中,因爲我認爲現在正在發生10GB而不是10GB x(分叉進程數量)。換句話說,我的所有進程可以共享一個Redis實例嗎?非常感謝。 – Arman