我们前面的两篇介绍了怎么定义多个进程,怎么利用进程这一资源。我们在淘宝业务中也是这样实践的,有一个问题也越发明显,进程间如何通信呢?
起初我们有一个比较简单的 IPC 实现,通过 Domain Socket 进行通信。也是传统的 C/S 架构的,两个进程间进行比较基础的消息通信(比较类似 Node-IPC 这个包)。
不过实在是太基础了,时不时地在想:
在同一台计算机上的同一个语言,为什么要搞得这么痛苦?是 Node.js 太弱了吗?
我要有线程的话,需要活的这么累吗?
之前的大致样子:
都是一些简单消息传递,只有 、 这样简单的元语。想做点什么,难度可想而知。
我们在 Pandora.js 中系统化地解决了这个痛点,就是接下来要介绍的 IPC-Hub。
进程间通信 IPC-Hub
经过一些思考和讨论,最简洁的莫过是:
我发布一个对象,这台计算机上的哪个 Node.js 进程都能调用。
这个对象上的方法我也不用额外地修饰,发布出去其他进程就能调用,就像调用一个普通对象上的方法一样。
你只需要用 Pandora.js 启动应用,下面这些能力都是标配的。
简洁的进程间对象代理
经过努力,我们提出了『简洁的进程间对象代理』,看下面的例子会清楚得多:
在 PID 为 1 的进程中:
在 PID 为 2 的进程中:
强大到,就连 Node.js 内置的对象都可以!
—— 作者语:虽然没什么实际用处。
Service 发布到 IPC-Hub
上一篇介绍到了 Service,正是可以利用的绝佳材料,可以很方便的发布到 IPC-Hub 中:
一个向任务进程投递网页截图任务的例子
为什么我们要把一些任务隔离进程?因为有些任务计算量大(比如大规模的定时任务)、或者不稳定因素太多(比如集成了不可靠的库),希望隔离于提供基础 Web 服务的进程组。
我们下面的例子中将介绍:
Web 服务收到用户的请求后,直接将任务通过 IPC-Hub 传递给任务进程,任务进程完成后再返回用户。
我们其中用到了 GoogleChrome/puppeteer,一个 Chrome Headless 的 Node.js Lib。
实现细节
下面讲到的例子在:https://github.com/midwayjs/pandora-example/tree/master/pageSnapshot 。
我们先将 procfile.js 写好:
下面最重要的是 ,表示将 pageSnapshot 这个 Service 发布到 IPC-Hub 中去,任何进程都可以调用了~
然后实现截图的 PageSnapshot
然后实现前台 Web 服务
下面的服务继承了一个基础类 SimpleHTTP,这里就不再引出了,基本上就是封装了一个 HTTP Server 上线下线逻辑。
下面的重点是获得 对象代理那里。
启动一个试试看
可以直接 Clone 例子试试看。
可以看到 background 和 worker 进程都已经启动了。
浏览器访问看看
访问 看看。
嗯,已经可以用了。
未完待续
这样 Pandora.js 的进程间通信能力就介绍完了,和进程模型相关的能力基本介绍完毕了。
下周开始介绍业务度量能力啦~ 比如 Metrics、全链路 Trace 等,大家敬请期待。
最后,不要忘了给点个 Star 喔~
https://github.com/midwayjs/pandora/
最后的最后,我们招人。我们有超过一半的淘宝前台访问在 Node.js 上,也有做开源 Node.js 软件的机会,挑战不小,当然回报也不小。
题图:https://unsplash.com/photos/kRLXoi3Dtqs By @Ian Simmonds
领取专属 10元无门槛券
私享最新 技术干货