2014-03-28 54 views
0

我有服務器上運行一個應用程序的NodeJS節點mysql和表示,起初,我面對的問題,其中一些例外不處理,應用程序將下井帶網絡連接問題。如何保持服務器和應用程序單獨

我處理所有未捕獲的異常和服務器不會走這時候反而它會掛起。我想這是因爲我只有在查詢沒有引發任何異常時才返回響應,所以我也處理了所有與查詢有關的異常。

下一頁如果MySQL服務器終止某種原因,我的應用程序將無法重新連接,我嘗試重新連接,但它會給出相關的「排隊連接握手或某事」的錯誤。從另一個堆棧問題,我應該使用連接池,所以如果服務器終止連接,它會重新獲得連接,如何,我做了什麼。

我在這裏的問題是,每一個我遇到的問題,我不得不關閉整個應用程序,並感謝到服務器配置時的NodeJS編程下降了。我可以或更好,但我怎麼能幾乎完全分離我的服務器和應用程序,以便如果我在我的應用程序中進行一些更改,我不會重新部署?

特別是現在一切都好的情況下,我的應用程序不斷給我連接池錯誤在服務器和開發版本中它的工作正常,所以即使我重新啓動我的應用程序,我不知道我將如何面對這個問題所以我可以正確診斷這一點。

讓我知道是否有人需要關於我的問題的更多信息。

回答

1

您使用的前端框架,以滿足您的應用程序,或者是你從服務器調用服務的這一切?因此,如果您的服務器barfs出於任何原因(即500錯誤),您想關閉並重新啓動,因爲一旦您的服務器處於該狀態,您的所有傳輸數據和您的堆棧都將處於未知狀態。沒有辦法從中正確恢復,所以從服務器和最終用戶的角度來看,您都更安全,以關閉進程並重新啓動。

您可以通過使用像Node的集羣模塊這樣的東西來最大限度地減少這種影響,它允許您分叉服務器的子進程並生成同一個服務器的多個實例,連接到同一個數據庫,允許在同一個端口上訪問因此,如果您的用戶(或您的服務器)設法擊中未處理的異常,則可以終止進程並重新啓動,而無需關閉整個服務器。

編輯:這裏有一個片段:

var cluster = require('cluster'); 
var threads = require('os').cpus().length; 


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

    cluster.on('exit', function(dead, code, signal) { 
     console.log('worker ' +dead.process.pid+ ' died.'); 
     var worker = cluster.fork(); 
     console.log('worker '+worker.process.pid+ ' started'); 
    }); 

} else { 
    // 
    // do your server logic in here 
} 

話雖這麼說,有沒有辦法讓你如果節點是服務於您的客戶端內容單獨運行你的應用和服務器。一旦你終止你的服務器,你的端點關閉。如果你真的希望能夠保持客戶端應用程序處於活動狀態並重新啓動服務器,則必須完全分離邏輯,即將您的應用程序放在與您的服務器不同的項目中,並僅將您的服務器用作API端點。

至於在節點MySQL連接池:我從來沒有使用的模塊,所以我不能說,最好的做法是那裏。

+0

我沒有使用集羣模塊讓我看看它是如何工作的。 –

+0

我已經添加了一個簡短的代碼片段,它很容易設置,您只需確保您的異常正在拋出'process.exit',以便它觸發羣集上的退出監聽器 –

相關問題