Node.Js執行原理圖引發的思考

原文地址:Node.Js執行原理圖引發的思考


筆者忽然在羣裏面看到這幅圖,主要是介紹Node.js的執行流程圖。圖中主要說明的一個事情是:Node.js會把所有的異步任務添加到一個事件池裏,每次只需要循環執行事件池裏面的任務。

從圖中可以看到,Q1-Q4都是異步任務,而當任務涉及到IO操作時,則會立即的釋放任務,執行下一個異步任務,因此從這個過程中我們會發現幾個問題。


1、入過於出時
當異步IO的操作時間很長的時候,導致異步任務Q1-Q4的執行時間很久。假設T1-T14之間爲30秒時,而這30秒內有5個任務進入,從而導致系統每30秒會在事件池中累積一個任務,最終導致的情況就是內存耗費會越來越大,從而導致內存不足,core異常。
Node.js項目開發過程中,我是深刻體驗到這個問題,當時主要的辦法是控制時間由原來的30秒擴大到5分鐘,或者是控制任務進入數量,每30秒我只從任務中拿取4個任務。所以對於大家所說的Node.js可以支持非常大的併發是有前提條件的,當然今天我說介紹的主要是在內存方面的限制。
大家可以想象,假設併發數是200個,而系統沒秒鐘處理的任務是150個,那麼就會在系統每秒產生50個任務的異步事件積累,最終如果併發持續1天,那麼會累計4320000個任務,假設一個任務佔用0.1k,那麼將會產生4320000*0.1/1000=432Mb的內存,在內存耗費越多的時候系統的處理內容也會越弱,這裏還沒有考慮,可想而知這將會是一個潛在的風險。

2、Q1執行時間久造成的異常
假設現在系統啓動運行,剛好此刻有500個異步請求進來,而這500個異步請求都是在請求同一個接口登錄,如果每個請求分別進行3次數據庫操作,此時500*3=1500查詢數據庫請求,那麼如果之前沒有產生數據庫句柄時,則Q1-Q500都會去嘗試連接數據庫。如果Q1連接時間大於1秒,那麼Q1-Q500都因爲之前沒有數據庫句柄從而都會嘗試連接數據庫,這樣有可能導致數據庫連接異常。
這種問題主要是在數據庫連接時沒有數據庫操作句柄造成的,解決這種問題的最好辦法就是在系統啓動的時候就產生數據庫操作句柄,這樣Q1-Q500進入時都有該數據庫操作句柄,從而無需請求句柄連接。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章