Egg: [RFC] 增加单进程启动模式

Created on 9 Nov 2018  ·  38Comments  ·  Source: eggjs/egg

背景

在容器化之后,应用运维的能力更加强大,已经不需要在框架层去处理这么复杂的逻辑了。以单进程的模式启动,并配合健康检查已经能基本完成现有 cluster 的功能。从资源利用率上看,只需要给 node 分配 1C1G 的资源或更少。

改造内容

单进程还是以 master 作为入口,但是不走 cluster 逻辑,可以按照 app_worker.js 这个文件执行。

通过入参 --disable-cluster 来判断是 cluster 还是非 cluster

proposals

Most helpful comment

提议

用 startServer 来替换 startCluster,并向下兼容。单进程还使用 cluster 确实有点怪,但是 egg-cluster 里包含了大量的能力,如启动 http 服务,异常退出,messenger 支持等功能。现在有部分通过 egg.start 来实现,但是 http 和 start 基本是耦合的,方法中很难再插入逻辑进去。

实现步骤

  1. egg-cluster 新增 startServer API,如果是非 single 转调 startCluster,两种模式保证参数和实现一致
  2. egg 依赖 egg-cluster 暴露 startServer API,可以直接替换此 API
  3. egg.start deprecate,当前 API 只实现了部分能力。

All 38 comments

赞,那 schedule 这些依赖 Agent 的怎么处理?

就 schedule 来说的话,我认为采用 k8s 生态的话应该从应用中独立出来,独立调度。

其他还有啥强依赖 agent 吗?

@killagu 感觉可以重新设计下分布式调度这块,这两个可以独立。现在的 schedule 可以做一层兼容。

watcher 和 development 也是基于 agent 的

这两个在生产模式也可以不用吧。看起来这三个在禁用 cluster 模式时,也可以同时关闭。

chair 那边我记得是有个 watcher 的扩展,用于做凤蝶模板的热更新的。

另外,多进程模型里面的通信模式,也是基于 cluster-client 的。

schedule 应该是运行在单独的离线环境,不关掉应该也警告下~

推模式应该要被干掉了。cluster-client 插件上要做一次整理,agent 和 worker 功能要统一。

并且 egg 也要修改为 worker 可以成为 cluster-client 中的 agent。

development 的 reload 可以考虑放到 egg-bin 去,不过现在工具层不好拿 config,拿到的那个感觉不一定准(虽然也够了)

我觉得应该是把 agentWorker 和 appWorker 都在一个进程中启动,然后将之前的 IPC 逻辑抽象出来,增加一个进程内的实现。这样才能保证单进程运行和多进程运行的兼容性。同时对性能也不存在什么影响。

@dead-horse 这个就是类似 egg-mock 的方式。

上面讨论的应该是兼容之外的,插件原来的对 agent 的实践方式是不是有新的方式

插件原来的对 agent 的实践方式是不是有新的方式

其实就没有 agent 什么事情了,单进程模式不需要 agent,不需要 cluster-client。如果是为了在容器中运行,就当做 agent 不存在好了,不需要引入新的架构实现吧

  1. 对于用到了 agentWorker 的,一般来说都是之前的模块和功能,通过提供一层 adapter 让它可以在同一个进程中运行
  2. 对于完全设计在容器环境运行的单进程模式框架和应用,不考虑 agent 的概念即可

如果 egg 为容器化部署操心的话, 应该列出几种部署容器的方式,再根据每种方式来做设计。

个人意见,仅提供实际部署方案参考。好像不需要引入新设计。

我们观点是一致的,我上面想提的是,可以把现在用到 agent 的一些插件拿出来 Review,看看:

  • 是直接 adapter 兼容好
  • 还是可以分解出新的容器环境下的设计(甚至独立插件)
  1. 对于用到了 agentWorker 的,一般来说都是之前的模块和功能,通过提供一层 adapter 让它可以在同一个进程中运行
  2. 对于完全设计在容器环境运行的单进程模式框架和应用,不考虑 agent 的概念即可

我们目前的业务跑在k8s里面,1c1g,agent感觉没实际意义,worker k8s就能实现进程守护。“进程的模式”这个功能大概什么时候能上?

我们目前的业务跑在k8s里面,1c1g,agent感觉没实际意义,worker k8s就能实现进程守护。“进程的模式”这个功能大概什么时候能上?

你说的这个正是我们要做的,大概近几个月就会做。但是需要社区也兼容这种方案,现在还不知道会有哪些问题。

我们目前的业务跑在k8s里面,1c1g,agent感觉没实际意义,worker k8s就能实现进程守护。“进程的模式”这个功能大概什么时候能上?

你说的这个正是我们要做的,�大概近几个月就会做。但是需要社区也兼容这种方案,现在还不知道会有哪些问题。

“单进程模式”下,是不是就能使用clinic进行代码性能分析了?目前clinic貌似不太好接入egg应用。

@JsonMa 是的,现在接什么都不好直接接。移除进程管理相关的, 我觉着egg库源码和配套工具代码都可以减少至少50%以上.....

@dead-horse 农历新年前出 poc。

期待。
在k8s里跑egg非常需要单进程模式。
当前egg都不适合放在k8s里跑,也不适合做replica

https://github.com/eggjs/egg/pull/3430 可以初步看看了。

插件秘钥能支持通过环境变量传入吗?

你直接在 config.default.js 里面读取 env 不就行了

提议

用 startServer 来替换 startCluster,并向下兼容。单进程还使用 cluster 确实有点怪,但是 egg-cluster 里包含了大量的能力,如启动 http 服务,异常退出,messenger 支持等功能。现在有部分通过 egg.start 来实现,但是 http 和 start 基本是耦合的,方法中很难再插入逻辑进去。

实现步骤

  1. egg-cluster 新增 startServer API,如果是非 single 转调 startCluster,两种模式保证参数和实现一致
  2. egg 依赖 egg-cluster 暴露 startServer API,可以直接替换此 API
  3. egg.start deprecate,当前 API 只实现了部分能力。

这个还准备做吗?k8里面单进程是刚需啊,都2020年了

这个还准备做吗?k8里面单进程是刚需啊,都2020年了

+1

现在版本的 egg 是不是还不支持脱离 egg-cluster 来运行,就是单进程的模式启动?

+1
其实现在是可以单进程启动的,只要require('egg').start()就可以了,但是貌似这个api还没有正式发布

require('egg').start(). 不行,它只是启动了 egg,但是没有启动 http server,需要自己再启动下 http server

require('egg').start(). 不行,它只是启动了 egg,但是没有启动 http server,需要自己再启动下 http server

这个能说说具体怎么做吗?不是太明白

require('egg').start().then(app => {
    const port = 80;
    app.listen(port);
});
require('egg').start().then(app => {
    const port = 80;
    app.listen(port);
});

这个试了下,修改了index.js,启动的时候还是启动了多个work
还有其他地方要改吗?

require('egg').start().then(app => {
    const port = 80;
    app.listen(port);
});

这个试了下,修改了index.js,启动的时候还是启动了多个work
还有其他地方要改吗?

不要用egg-script,直接用node index.js

require('egg').start().then(app => {
    const port = 80;
    app.listen(port);
});

这个试了下,修改了index.js,启动的时候还是启动了多个work
还有其他地方要改吗?

不要用egg-script,直接用node index.js

直接用node启动可以了,但是控制台输出提示

single process mode is still in experiment, please don't use it in production environment

那么现在单进程模式到底是否能用于生产?结合上面大佬的话

egg.start deprecate,当前 API 只实现了部分能力。

到底是实现了哪些能力?缺失了哪些能力?是否能明示一下
实在等不了官方的正式实现了

这周给一个非官方的示例

这周给一个非官方的示例

也就是说其实目前是已经有这个功能,只是没有正式demo和文档是么?

@gxcsoccer 下周回国

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Azard picture Azard  ·  3Comments

aka99 picture aka99  ·  3Comments

wujianling picture wujianling  ·  3Comments

yuu2lee4 picture yuu2lee4  ·  3Comments

Leungkingman picture Leungkingman  ·  3Comments