Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] 增加单进程启动模式 #3180

Open
popomore opened this issue Nov 9, 2018 · 43 comments
Open

[RFC] 增加单进程启动模式 #3180

popomore opened this issue Nov 9, 2018 · 43 comments
Assignees

Comments

@popomore
Copy link
Member

popomore commented Nov 9, 2018

背景

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

改造内容

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

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

@popomore
Copy link
Member Author

popomore commented Nov 9, 2018

健康检查的实现 #3161

@atian25
Copy link
Member

atian25 commented Nov 9, 2018

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

@atian25 atian25 changed the title 增加单进程启动模式 [RFC] 增加单进程启动模式 Nov 9, 2018
@killagu
Copy link
Contributor

killagu commented Nov 9, 2018

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

其他还有啥强依赖 agent 吗?

@popomore
Copy link
Member Author

popomore commented Nov 9, 2018

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

@atian25
Copy link
Member

atian25 commented Nov 9, 2018

watcher 和 development 也是基于 agent 的

@killagu
Copy link
Contributor

killagu commented Nov 9, 2018

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

@atian25
Copy link
Member

atian25 commented Nov 9, 2018

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

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

@okoala
Copy link
Member

okoala commented Nov 9, 2018

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

@killagu
Copy link
Contributor

killagu commented Nov 9, 2018

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

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

@atian25
Copy link
Member

atian25 commented Nov 15, 2018

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

@dead-horse
Copy link
Member

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

@atian25
Copy link
Member

atian25 commented Nov 15, 2018

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

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

@dead-horse
Copy link
Member

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

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

@dead-horse
Copy link
Member

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

@zysam
Copy link

zysam commented Nov 15, 2018

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

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

@atian25
Copy link
Member

atian25 commented Nov 15, 2018

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

  • 是直接 adapter 兼容好
  • 还是可以分解出新的容器环境下的设计(甚至独立插件)

@JsonMa
Copy link

JsonMa commented Nov 23, 2018

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

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

@popomore
Copy link
Member Author

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

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

@JsonMa
Copy link

JsonMa commented Nov 26, 2018

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

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

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

@xingyuzhe
Copy link

xingyuzhe commented Dec 12, 2018

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

@fengmk2
Copy link
Member

fengmk2 commented Jan 3, 2019

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

@kennylbj
Copy link

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

@fengmk2
Copy link
Member

fengmk2 commented Jan 28, 2019

#3430 可以初步看看了。

@bakso
Copy link

bakso commented Feb 18, 2019

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

@atian25
Copy link
Member

atian25 commented Feb 18, 2019

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

@popomore
Copy link
Member Author

popomore commented Mar 18, 2019

提议

用 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 只实现了部分能力。

@shinji3887
Copy link

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

@funkyLover
Copy link

funkyLover commented Apr 5, 2020

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

+1

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

@terry-fei
Copy link

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

@gxcsoccer
Copy link
Contributor

gxcsoccer commented Jun 24, 2020

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

@shinji3887
Copy link

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

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

@wangwangtou
Copy link

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

@shinji3887
Copy link

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

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

@wangwangtou
Copy link

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

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

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

@shinji3887
Copy link

shinji3887 commented Jul 7, 2020

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 只实现了部分能力。

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

@gxcsoccer
Copy link
Contributor

这周给一个非官方的示例

@CodeLittlePrince
Copy link

这周给一个非官方的示例

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

@hsiaosiyuan0
Copy link

@gxcsoccer 下周回国

@sjfkai
Copy link
Contributor

sjfkai commented Aug 10, 2021

请问目前进度怎样了 还在推进吗?

@zcong1993
Copy link

这个能上生产了吗?

@lianhr12
Copy link

我再问下,k8s 部署egg的正确打开方式是怎么样

@iskeepingon
Copy link

问题最终解决方案是什么?

@atian25
Copy link
Member

atian25 commented Jun 21, 2022

就我们的实践来看,其实单进程的收益没有想象中的那么大。
如果是有后端中间件的场景,如果没有 sidecar 的话,那跟后端的 RPC 的建联数会被放大掉。

eggjs/egg-cluster#100 这个 PR 会探索一种 work thread 的方式。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests