阿里eggjs中有個核心就是egg-cluster來做基本的啟動流程,裡面的通訊還是比較有意思的。仔細研究了下nodejs官方的cluster再加上eggjs的agent
理念,如果要保持通訊,還是踩了不少的坑。這個坑其實來自cluster
自身。如果是剛研究cluster
,那麼很多人都是被其迷惑,到底是如何監聽,如何傳送呢?
先理解一些概念:
想要在這些程序上互相通訊,我們需要理清楚傳送的方式。
如何讓其完美通訊,我這裡推薦乙個庫 github.com/cevio/ipc-m…。它能讓你在無感知的情況下幫你繫結完畢所有的事件,同時打通資訊通道。
它是乙個類,需要被繼承後使用。
const ipcmessage = require('ipc-message');
module.exports = class
nodebase
extends
ipcmessage
] receive message:`, msg);
});if (this.type === 'master') else
}}複製**
我們通過繫結message
事件來獲得訊息,通過registagent
來註冊agent,通過cluster.fork()
來建立子程序,當然這個建立是被自動監聽的,你無需關心。
很簡單,他們在任意的**中通過send方法來傳送訊息。比如如上的例子(假設已經設定來乙個名字為staticagent
的agent和建立了4個worker,現在是在worker執行的**上):
const base = new nodebase();
base.send('staticagent', 'worker-ready', );
複製**
agent通過master的**就收到了該資訊
[staticagent] agent receive message:
}複製**
你可以通過這個資料來解析,具體如何解決全靠個人想法了。
我們來看2段實際**
test/index.js
const ipcmessage = require('ipc-message');
const childprocess = require('child_process');
const path = require('path');
const cluster = require('cluster');
const koa = require('koa');
const os = require('os');
class
nodebase
extends
ipcmessage
); // 註冊該agent
this.registagent('agent', agent);
let cpus = os.cpus().length;
while (cpus--)
} else );
ctx.body = 'hello world';
});console.log('server start at 3000');
});}
this.on('message', msg => ] onmessagereceive:`, msg);
});}}
const nodebase = new nodebase();
if (nodebase.type === 'master') );
}, 5000)
}複製**
test/agent.js
const ipcmessage = require('ipc-message');
class
agent
extends
ipcmessage
, 1000);
process.on('sigint', () => );
this.on('message', msg => )
}}const agent = new agent();
// 傳送訊息
agent.send('master', '/agent/ready', );
複製**
有了通訊處理的簡化模組,你也可以嘗試使用其來建立類似egg的啟動流程,egg的核心啟動也就不再神秘了。 關於METHOD BUFFERED驅動通訊方式
緩衝 方法 method buffered 備註 在下面的討論中,輸入 表示資料從使用者模式的應用程式到驅動程式,輸出 表示資料從驅動程式到應用程式。對於讀取請求,i o 管理器分配乙個與使用者模式的緩衝區大小相同的系統緩衝區。irp 中的 systembuffer 字段包含系統位址。userbuf...
關於Java串列埠通訊
enumeration en commportidentifier.getportidentifiers commportidentifier portid while en.hasmoreelements 複製 以上 可以列出電腦上所有的可用串列埠,前提是電腦上是有串列埠的,如果沒有的話,會出現異...
關於程序間通訊
程序間通訊 ipc 的方式很多。下面進行歸類總結。在傳統的程序間通訊中有 無名管道,有名管道,訊號通訊。後來system v 退出了自己的ipc 方式 訊息佇列,共享記憶體和訊號燈集合但是system v的通訊方式也存在自己的缺點。posix 在此基礎上退出了自己的posix的訊息佇列,共享記憶體和...