關於IPC Message通訊

2021-09-11 09:25:05 字數 2340 閱讀 7857

阿里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的訊息佇列,共享記憶體和...