大家都知道nodejs是一個單程序單線程的伺服器引擎,不管有多麼的強大硬體,隻能利用到單個cpu進行計算。是以,有人開發了第三方的cluster,讓node可以利用多核cpu實作并行。随着nodejs的發展,讓nodejs上生産環境,就必須是支援多程序多核處理!在v0.6.0版本,nodejs内置了cluster的特性。自此,nodejs終于可以作為一個獨立的應用開發解決方案,映入大家眼簾了。
cluster是一個nodejs内置的子產品,用于nodejs多核處理。cluster子產品,可以幫助我們簡化多程序并行化程式的開發難度,輕松建構一個用于負載均衡的叢集。
每個worker程序通過使用child_process.fork()函數,基于ipc(inter-process communication,程序間通信),實作與master程序間通信。
當worker使用server.listen(...)函數時 ,将參數序列傳遞給master程序。如果master程序已經比對workers,會将傳遞句柄給勞工。如果master沒有比對好worker,那麼會建立一個worker,再傳遞并句柄傳遞給worker。
在邊界條件,有3個有趣的行為:
注:下面server.listen(),是對底層“http.server-->net.server”類的調用。
1. server.listen({fd: 7}):在master和worker通信過程,通過傳遞檔案,master會監聽“檔案描述為7”,而不是傳遞“檔案描述為7”的引用。
2. server.listen(handle):master和worker通信過程,通過handle函數進行通信,而不用程序聯系
3. server.listen(0):在master和worker通信過程,叢集中的worker會打開一個随機端口共用,通過socket通信,像上例中的57132
當多個程序都在 accept() 同樣的資源的時候,作業系統的負載均衡非常高效。node.js沒有路由邏輯,worker之間沒有共享狀态。是以,程式要設計得簡單一些,比如基于記憶體的session。
因為workers都是獨力運作的,根據程式的需要,它們可以被獨立删除或者重新開機,worker并不互相影響。隻要還有workers存活,則master将繼續接收連接配接。node不會自動維護workers的數目。我們可以建立自己的連接配接池。
cluster對象
cluster的各種屬性和函數
cluster.setttings:配置叢集參數對象
cluster.ismaster:判斷是不是master節點
cluster.isworker:判斷是不是worker節點
event: 'fork': 監聽建立worker程序事件
event: 'online': 監聽worker建立成功事件
event: 'listening': 監聽worker向master狀态事件
event: 'disconnect': 監聽worker斷線事件
event: 'exit': 監聽worker退出事件
event: 'setup': 監聽setupmaster事件
cluster.setupmaster([settings]): 設定叢集參數
cluster.fork([env]): 建立worker程序
cluster.disconnect([callback]): 關閉worket程序
cluster.worker: 獲得目前的worker對象
cluster.workers: 獲得叢集中所有存活的worker對象
worker對象
worker的各種屬性和函數:可以通過cluster.workers, cluster.worket獲得。
worker.id: 程序id号
worker.process: childprocess對象
worker.suicide: 在disconnect()後,判斷worker是否自殺
worker.send(message, [sendhandle]): master給worker發送消息。注:worker給發master發送消息要用process.send(message)
worker.kill([signal='sigterm']): 殺死指定的worker,别名destory()
worker.disconnect(): 斷開worker連接配接,讓worker自殺
event: 'message': 監聽master和worker的message事件
event: 'online': 監聽指定的worker建立成功事件
event: 'listening': 監聽master向worker狀态事件
<a></a>