node.js的常見的提高效能的幾個方式
如果不敬意求精的話,可能沒必要在意一些小的細節,只要能夠完成任務,實現功能即可。
但是很多時候又必須要要注意細節,因為比較大型的專案,可能很小的細節就能夠影響到專案的想能,尤其是負載比較高的時候。
下面是幾個常見的能夠提高node.js效能的方式和大家分享一下。
一.避免使用同步程式碼:
node.js是單執行緒的,為了能讓一個單執行緒處理許多併發的請求,可以永遠不要讓執行緒等待阻塞,同步或長時間執行的操作。Node.js的一個顯著特徵是:它從上到下的設計和實現都是為了實現非同步。這讓它非常適合用於事件型程式。
不幸的是,還是有可能會發生同步/阻塞的呼叫。例如,許多檔案系統操作同時擁有同步和非同步的版本,比如writeFile和writeFileSync。即使用程式碼來控制同步方法,但還是有可能不注意地用到阻塞呼叫的外部函式庫。那麼,對效能的影響是極大的。
[JavaScript] 純文字檢視 複製程式碼// Good: write files asynchronously fs.writeFile('message.txt', 'Hello Node', function (err) { console.log("It's saved and the server remains responsive!"); }); // BAD: write files synchronously fs.writeFileSync('message.txt', 'Hello Node'); console.log("It's saved, but you just blocked ALL requests!");
初始化log在實現時無意地包含了一個同步呼叫來將內容寫入磁碟。如果不做效能測試那麼就會很容易忽略這個問題。當以developer box中一個node.js例項來作為標準測試,這個同步呼叫將導致效能從每秒上千次的請求降至只有幾十個。
二.關閉套接字池:
node.js的http客戶端會自動地使用套接字池:預設地,它會限制每臺主機只能有5個套接字。雖然套接字的重複使用可能會讓資源的增加在控制之下,但如果需要處理許多資料來自於同一主機的併發請求時,將會導致一系列的瓶頸。在這種情況下,增大maxSockets 的值或關閉套接字池是個好主意:
[JavaScript] 純文字檢視 複製程式碼// Disable socket pooling var http = require('http'); var options = {.....}; options.agent = false; var req = http.request(options)
三.不要讓靜態資源使用Node.js:
對於css和圖片等靜態資源,用標準的WebServer而不是Node.js。例如,領英移動使用的是nginx。同時還利用內容傳遞網路(CDNs),它能將世界範圍內的靜態資拷貝到伺服器上。這有兩個好處:
(1)能減少我們node.js伺服器的負載量 。
(2)CDNs可以讓靜態內容在離使用者較近的伺服器上傳遞,以此來減少等待時間。
四.在客戶端渲染:
快速比較一下伺服器渲染和客戶端渲染的區別。如果用node.js在伺服器端渲染,對於每個請求都會回送像下面這樣的HTML頁面:
[HTML] 純文字檢視 複製程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> </head> <body> <div class="header"> <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/></div> <div class="body">Hello John!</div> </body> </html>
這個下面頁面所有的內容,除了使用者的名字,其餘都是靜態內容:對於每個使用者和頁面過載內容都是一樣的。因此更有效的作法是讓Node.js僅以JSON形式返回頁面需要的動態內容。
[JavaScript] 純文字檢視 複製程式碼{"name": "John"}
頁面的其餘部分—所有靜態的HTML標記-能放在JavaScript模板中(比如underscore.js模板):
[HTML] 純文字檢視 複製程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> </head> <body> <div class="header"> <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/> </div> <div class="body"> Hello <%= name %>! </div> </body> </html>
效能的提升來自於這些地方:如第三點所說,靜態JavaScript模板能通過webserver(比如nginx)在伺服器端提供,或者用更好的CDN來實現。此外,JavaScript模板能快取在瀏覽器中或儲存在本地,所有初始頁面載入以後,唯一需要傳送給客戶端的資料就是JSON,這將是最有效果的。這個方法能極大性地減少CPU,IO,和Node.js的負載量。
五.使用gzip:
相關文章
- 幾個常見的MySQL效能測試工具RQMySql
- 異常-Throwable的幾個常見方法
- 提高API效能的幾個綜合策略API
- 幾種常見的Vue元件間的傳參方式Vue元件
- 幾種常見的效能測試方法概述
- grub常見的幾個問題
- 前後端常見的幾種鑑權方式後端
- 【開發經驗】幾種常見的加密方式加密
- 入行 AI 的幾個常見問題AI
- 幾種常見的延遲執行處理方式
- 關於ImageView的幾個常見問題View
- python語言幾個常見函式的使用Python函式
- 幾種常見的NO SQL DBSQL
- 21. 羅列常見的幾個執行時異常
- WEB常見的攻擊方式Web
- Linux上安裝MySQL的幾種常見方式的過程和步驟LinuxMySql
- 福祿克測試的幾個常見不透過的因素
- Linux常見的網路排查指令,你知道幾個?Linux
- 惡意軟體開發——shellcode執行的幾種常見方式
- iOS常見的幾種加密方法iOS加密
- 幾種常見的CSS佈局CSS
- Java常見的本地儲存方式Java
- 聊聊 HTTP 常見的請求方式HTTP
- 【知識分享】常見的幾個web伺服器分享Web伺服器
- 5種常見的黑客攻擊手段,你知道幾個?黑客
- 技術人溝通中的幾個常見問題
- 影響HTTP效能的常見因素HTTP
- Linux新手常見的7個認知誤區,你中了幾個?Linux
- 使用 Promise 時的5個常見錯誤,你佔了幾個!Promise
- istio 常見的 10 個異常
- MySQL中幾種常見的日誌MySql
- 幾種常見的JSP中文亂碼JS
- Javascript 常見的迴圈方式總結JavaScript
- 常見的伺服器鑑權方式伺服器
- 滲透測試常見的9大漏洞,你知道幾個?
- Linux下常見的開源資料庫,你知道幾個?Linux資料庫
- 幾種常見網路抓包方式介紹
- 9個常見的專案管理挑戰及應對方式專案管理
- 提高 PostgreSQL 插入效能的 5 個技巧SQL