http://learnboost.github.com/cluster/
像上一篇 nodejs 轉載的文章提到一點關於多核心框架的一些概念,最近看到這款 多核心伺服器 模組,搭配作者拍的介紹影片,感覺就很容易使用,而且功能很強大的感覺…
介紹:
什麼是多核心伺服器?由於 nodejs 底層實做的方式是採用 nio (asyn) 來減少在伺服器 IO 時所等待的時間,所以採用 Event based 的架構,所有的 io 處理都透過事件佇列回應 callback function 來運作,也因此採用單執行緒運作且就能達到很好的效能。
但一隻程式只用到一個核心,對於現代多核心的伺服器來講也太浪費了吧~,因此如果你想要在 nodejs 用到多核心的方法,就只有多跑幾個 process 了,但當一堆 process 的伺服器在運作時,該怎麼管理與如何平衡負載就是一個麻煩了。
所以這個 cluster 的作者就是在解決這個問題,而這個 multi-core server 也不光只是能用在 nodejs 擅長的 web server 的情況而已,由於只是執行續的管理為主,所以不管什麼樣的伺服器都能透過他來管理與運行。作者從二月中到現在才獨立開發一個月就已經成長到 5.2 版本,就能顯示出這種模組的實際需求,或許他自己本身在 LearnBoost 的工作也在負責這一塊呢。
特性:
官網上寫了一堆特性,大概提幾個實做上作者考慮到的點,
- 零停機重啟:當伺服器程式修改過,一般來講都要將伺服器重啟來重讀新程式,而 cluster 可以讓現有在運行的 processes 不停機的狀況下銜接上重啟的新伺服器。
- 優雅的停機:讓現有使用者不斷線的情況下,漸漸的關閉所有伺服器。
- 停機:就是直接關機…也可以很不優雅 @Q@
- 可擴充:提供以 plugin 的方式擴充。
- ..
模組:
- api documentation
主要函式的使用方式與 api,以及 plugin 的撰寫方式。
- cli provides a command-line interface for your cluster
提供一個小工具模組讓你可以簡單的撰寫命令列的銜接介面,例如可以寫 –help –stat –restart,等指令來查看伺服器狀態或與伺服器溝通。
- debug verbose debugging information
一個可以讓你顯示所有伺服器程序運行狀態資訊的 plugin
- logger master / worker access and error logs
與上述類似,將 log 訊息的內容可以寫到指定檔案中,還可以分錯誤等級,debug,warning..之類的。
- pidfiles writes master / worker pid files
讓你可以查詢與指令 每個程序的 pid 存放,可以額外寫管理或監控的 plugin。
- reload reloads workers when files change
可以指定監控某些檔案,當這些檔案改變的話的重啟所有伺服器。
- repl perform real-time administration
提供一個 telnet 的介面,功能簡潔有利…幾乎就是把上面他提到的模組都有實做。
- stats adds real-time statistics to the repl plugin
在 repl 裡面實做 檢視所有伺服器狀態。
影片裡面有提到,如果要重啟伺服器可以至 telnet 至 repl 內下 restart() 就可以重啟了,另外 help() 是查詢支援的指令。
貼上一個 github 的範例,順便提一下,剛在看得時候作者剛好釋出 5.0版…
Example
app.js: 先寫一個普通的 http server..
var http = require('http'); module.exports = http.createServer(function(req, res){ console.log('%s %s', req.method, req.url); var body = 'Hello World'; res.writeHead(200, { 'Content-Length': body.length }); res.end(body); });
server.js: 在寫 cluster 去引入 server 的程式,然後設定好 plugin 以後就可以開始跑了…指令 repl 監聽 8888。
var cluster = require('cluster') , app = require('./app'); cluster(app) .use(cluster.logger('logs')) .use(cluster.stats()) .use(cluster.pidfiles('pids')) .use(cluster.cli()) .use(cluster.repl(8888)) .listen(3000);
一個 repl 運作的樣子,telent 進去以後下指令,查詢現在的 processes 分別在哪些 pid ,重啟後在查詢一次。
cluster> pids() pids master: 1835 worker #0: 1837 worker #1: 1838 worker #2: 1843 worker #3: 1844 cluster> restart() restarting 4 workers cluster> pids() pids master: 1835 worker #0: 1845 worker #1: 1849 worker #2: 1848 worker #3: 1847
小感:
感覺自從 nodejs 出來以後他各式模組發佈的速度都很多又很快,猜想是因為 js 的開發簡易,且領域很新許多東西都還沒做過,也不同以往開發的流程與模式,很容易兜一兜就有新東西出來,且異於往常,且大部分都是 OpenSource。
由於 nodejs 切入的時機正是 github(git) 在不斷成長的時候,搭上 web 與瀏覽器技術的轉機,呈現出一種不同與以往程式語言社群的一種風格,相當的自由開放活躍,也不是說其他語言沒有,而是因為太容易用 js 寫出一個新東西擺上 github 上分享,實做快速變化又多,像 jQuery 運行了那麼長的時間,花了幾年的時間還能夠不斷進步就可以大致瞭解,js 是一種容易實做出結果但不容易將之改善至極的語言。
註:https://github.com/languages 目前 js 已經是 github 排行版第一名..
相關資源:
- http://www.infoq.com/articles/multi-core-node-js 最近有一篇相關多核心 node.js 的專案作者訪談