2013-01-20 28 views
2

我一直在四處想看看是否有人遇到了這一點,但我有點不期待,這就是我發現了什麼。單進程多線程socket.io在Node.js應用程式

我面對現在的問題是關係到我正在創建的應用程序架構的問題; node.js中的遊戲服務器到目前爲止,服務器啓動時只需一個「管理者」進程即可控制所有子進程。遊戲的每個「區域」或「區域」使用cluster.fork()使用單獨的過程分解,以便每個「區域」可以在服務器上擁有自己的線程,以優化服務器在以下位置運行多個「區域」的能力:一旦。

我現在面臨的困境是這樣的。由於每個「區域」都在一個線程中運行,並且該線程已經每秒運行復雜的3D數學運算X次,以保持「區域」同步,所以我不想打開Socket.io(通信用於與遊戲客戶端交談的庫)在同一個線程中。我想我掛在哪裏是在主進程中使用cluster.on('message')處理程序的性能,並使用process.send({...})將來自Socket.io的消息傳遞到主進程中。

我想看看別人有經驗,用這個或知道一個基本的層面怎麼說整個集羣模塊的作品,基本上這樣的:

它更快打電話:

var io = require('socket.io').listen(1337); 
io.sockets.on('connection',...); //map all the functionality here in the "zone" thread 

或者做一些更是這樣的:

var cluster = require('cluster'); 
var io = []; 
//arbitrary number for the thread count, not important for theory testing 
for(var i = 0; i < 4; ++i) { 
    var process = cluster.fork({...}); 
    process.on('message',myRelayFunction); 
    io.push(process); 
} 

假設,當然了cluster.fork()呼叫管道進入一個腳本,什麼也沒做,但打開socket.ioç連接並將來自各種客戶端的消息轉發到「區域」過程。

我試圖在這個運行性能測試,但我發現這很難說,如果這是快還是沒有,因爲我有困難的飽和與機器的連接,以獲得輸出與測試。

我要確保這是可伸縮的,這樣較重的負載下,應用程序可以讓多個CPU內核的服務器上物盡其用。所以當然說我應該將socket.io監聽器多線程化爲多個線程,但是我擔心的是,因爲他們在技術上都回到單線程進程中,所以不會讓我多任何可能的性能增加 - 解讀他們?我在這裏的測試/基準測試部門空洞起來,我不知道這些理論背後的理論足以說明這裏最好的基本方法......所以我非常感謝任何反饋/輸入任何人有此;)

回答

4

我能夠做一些更多的測試,似乎是在一個單獨的線程具有socket.io聽衆仍然是表現非常有利的,即使他們有管道數據輸入/輸出的單個「區域」(經理)流程。通過這種方式,服務器可以使用單獨的CPU來處理IO處理,而不是區域處理。

所以這裏的答案是肯定的,它仍然是有利於你的聽衆/插座多線程成單獨的線程,即使所有的線程都與一些單個線程通信。這當然會導致我遇到的另一個問題,那就是如何最佳地優化node.js中多個子進程之間的通信。因爲這是此進程中下一個邏輯步驟/障礙,所以我將鏈接到下面的這個問題,以防萬一否則最終會阻礙他們解決這個問題。

Inter-child-process communication options in node.js cluster

+0

你真的在這裏天才布賴恩... –