天天看點

寫了一個簡單的NodeJS實作的程序間通信的例子

大家都知道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狀态事件

寫了一個簡單的NodeJS實作的程式間通信的例子
寫了一個簡單的NodeJS實作的程式間通信的例子

<a></a>

繼續閱讀