应用场景

EggBornJS底层基于EggJS,我们知道EggJS支持Cluster模式,同时开启多个工作进程为前端提供服务

EggBornJS新增了Broadcast机制,允许向所有工作进程发送一个广播,从而让所有工作进程同时执行某一个任务

下面我们以模块test-party为例,开发一个Broadcast

声明Broadcast

src/module/test-party/backend/src/config/config.js

module.exports = appInfo => {
  const config = {};

  // broadcasts
  config.broadcasts = {
    broadcastTest: {
      path: 'test/feat/broadcast',
    },
  };

  return config;
};
名称 说明
broadcastTest Broadcast名称
path 需要执行的后端API路由

声明API路由

src/module/test-party/backend/src/routes.js

{ method: 'post', path: 'test/feat/broadcast', controller: testFeatBroadcast, middlewares: 'inner' },
名称 说明
middlewares 指定中间件inner,只允许内部调用

添加控制器方法

src/module/test-party/backend/src/controller/test/feat/broadcast.js

async broadcast() {
  const { sameAsCaller, message } = this.ctx.request.body;
  if (!sameAsCaller) {
    // do something
  }
  assert.equal(message, 'hello');
  this.ctx.success();
}
名称 说明
sameAsCaller 标识当前是否是触发广播的工作进程
message 自定义参数

触发Broadcast

src/module/test-party/backend/src/controller/test/feat/broadcast.js

async emit() {
  this.ctx.app.meta.broadcast.emit({
    subdomain: this.ctx.subdomain,
    module: 'test-party',
    broadcastName: 'broadcastTest',
    data: { message: 'hello' },
  });
  this.ctx.success();
}
名称 说明
subdomain 当前实例对应的子域名,以便执行广播任务时可以正确的回到当前实例的运行环境
module 广播所属模块名称
broadcastName 广播名称
data 向广播传递的参数

特殊广播:重启所有工作进程

EggBornJS提供了一个特殊广播,用于重启所有工作进程。触发此广播如下:

this.ctx.app.meta.broadcast.reload();