首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

让进程间通信更容易-Pandora.js的IPC-Hub

我们前面的两篇介绍了怎么定义多个进程,怎么利用进程这一资源。我们在淘宝业务中也是这样实践的,有一个问题也越发明显,进程间如何通信呢?

起初我们有一个比较简单的 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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171222G0E8Z100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券