0%

EggCluster启动流程

graph LR;

startCluster --> Master
Master --> agent_worker
agent_worker --> Agent
Agent --> agentWorkerLoader
Master --> app_worker
app_worker --> Application
Application --> appWorkerLoader

EggCluster启动的简略流程如下:

  1. 调用startCluster函数,实例化Master类,并注册ready回调。
  2. Master类中实例化一个WorkerManager来管理子进程信息。
  3. 实例化Messenger来维持进程间通信。
  4. clusterCient功能和stickyMode(如果有开启)获取空闲端口。
  5. 启动agent进程,转发agent进程的消息到Messenger
  6. Agent进程:
    1. 实例化框架的Agent类。
    2. Agent准备好后,给master进程发送agent-start事件。
  7. master进程收到agent-start事件后,使用cfork启动指定数量的app进程。
  8. 转发所有app进程的消息到Messenger,并添加进程信息到WorkerManager
  9. App进程:
    1. 实例化框架的Application类。
    2. master进程发送真实监听的协议与端口。
    3. Application加载完毕后,创建http(s) Server,并监听指定端口。
  10. master进程中的cluster模块收到listening事件后,给自己发送app-start事件。
  11. agent进程发送当前活跃的worker进程信息。
  12. 如果是sticky模式,在master进程监听指定端口的tcp链接,然后根据ip分别发送给固定的worker。
  13. 触发ready事件。
  14. appagentparent进程发送egg-ready消息。
  15. 定时检查agentapp进程状态。
  16. 启动完成。

总结

EggCluster模块主要实现了以多进程模式启动Egg,并维持app, agent, master, parent进程之间的通信,在worker进程出错时能启动新的进程。