专栏首页YuanXinVemoJS源码拆解

VemoJS源码拆解

主要分析下 src 文件夹下的代码。从简单到难吧。

utils.js

按照命名,肯定是封装一些常用的方法。这里只提供了一个 cpuNum 的 getter 接口。

这个是计算当前计算机的 cpu 核心数目,用于决定开启多大的集群进程。为了保证效率,最小的返回值是 4。

error.js

主要从 Error 对象上继承并且创建了新对象: VemoError 。对象构造函数上, 设计了一个有关此框架的错误状态码的信息

除了 VemoError ,还暴露了一些错误的代号定义。

cluster.js

对外暴露了自定义的高并发集群代码,它引用了同级的 ./process.js 封装的管理类,并且初始化了它。它的具体含义请见”process.js”中的讲解。

cloudbase.js

getLocalSecret 方法是读取本地用户的根目录中的 .tcbrc.json 配置文件,并且将 Id 和 Key 放入 process.env 变量中。

getTempSecret 方法是获取云主机的临时密钥:

  1. 正常情况下,访问远程地址,获取 id、key、token 和过期时间,并且放入 process.env 变量中。 有个不错的设计点:过期时间比远程动态减少 600s,主要是为了提前拉取
  2. 异常情况下, 如果没有到达最大失败次数,则在异常捕获中,调用自身,进行重试 。这里也是一个不错的设计点,包括参数的传递。(不需要用闭包)
  3. 改进意见
  4. 考虑到网络情况造成的异常情况处理,其实可以使用定时器调用。
  5. 检测位置可以提到函数入口,考虑参数为 (0, -1) 的情况

对外暴露: async 函数,就是拿到有效的临时密钥,并且挂载上下文,继续执行后面的程序(next 参数)。

process.js

整体的设计思路是:一个主进程,多个工作进程。为了保证工作进程有效,又采用了”心跳机制” + “生命周期” + “定时检测”3 种机制来保证有效以及意外情况下的重启机制。

除此之外,在内存不足的时候,会自动降级服务!

内置方法

timer 函数,就是一个类似 setInterval 的函数。与 setInterval 不同的地方有 2 点:

  1. 回调函数的参数:当前的时间戳
  2. 第一次是立即执行的

restartWorker 函数,专门用来重启工作进程的函数。 它首先会检测距离上次批量重启的时间是否太短,太短,则跳过。 根据全局环境设置,这里的每次自动重启检测的时间是 60s。 否则,循环遍历所有子进程, 检查当前子进程的存活时间是否超过规定(60min) ,超过,就调用 killWorker 先新建再删除。 这个函数的精彩之处,在于时间上的处理。一言:每分钟自动检测进程更新,每个进程都会在 1 小时后被依次自动更新。

killWorker 函数,先启动新进程占位,再删除原进程。

  1. 对于新建的进程:监听 killSelf 新号,重建自己;监听 hearBeat 心跳信号。
  2. 对于被替换的老进程:先断开连接,再 2s 后 kill 掉。( problem:为什么先断链,再关闭呢 ?如果有大运算,调用 disconnect 会阻塞并不会关闭 IPC 管道。需要等待 2s 自定义缓冲时间, 再强制 kill ,不再调用 disconnect,因为还会阻塞)。

对外暴露方法

init 函数,初始化进程管理器:

  1. 对于主进程
  2. 根据 cpu 核心创建工作进程
  3. 每个工作进程监听 3 种信号并且响应
  4. 开启 restartWorker,对于超过生命周期的进程,自动重启
  5. 再定义一个 timer,检测每个工作进程存活状态,以及心跳是否正常
  6. 对于工作进程
  7. 加载 index.js 中的端口逻辑,若有出错,则告知主进程,并且关闭主进程( problem:主进程会自动关闭其他工作进程吗? cluster 已经帮忙做了,linux 下通过 ps -aux | grep “…” 可以查看)
  8. 定义一个 timer,向主进程发送心跳包
  9. 定义一个 timer,检测内存占用过高,主进程关闭工作进程( problem:process.memoryUsage()是全部的吗?是当前进程的信息

reload 函数,重启全部进程: 这个设计的很巧妙,因为全部工作进程的创建时间都放在 workerCreateTime 对象中,主进程中又开启了自动重启子进程的 timer(在 120 行)。所以这里直接一个循环,将其所有属性置 0。 当然,这并不是同时重启,每个子进程的重启有个间隔,这个间隔可以改进,因为这个间隔期间就是服务器响应能力比较弱的时候

index.js

在工作进程启动端口相关的服务,主要分为 3 个部分:普通 http 服务、websocket 服务以及静态服务器服务。

请分别调研使用它们的服务对应的库的用法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NodeJS模块研究 - cluster

    Nodejs 提供了 cluster 来支持服务集群的扩展,提高多核 CPU 的利用效率,实现负载均衡,最大程度利用机器性能。本文从以下几个方面介绍 clust...

    心谭博客
  • 剑指offer - 机器人的运动范围 - JavaScript

    题目描述:地上有一个 m 行 n 列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右...

    心谭博客
  • NodeJS模块研究 - process

    process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API。从文档出发,管中窥豹,进一步认识和学习 process...

    心谭博客
  • Python Web学习笔记之并发编程的孤儿进程与僵尸进程

    Jetpropelledsnake21
  • Swoole开发要点介绍

    摘要:简介Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,Asyn...

    叫我可儿呀
  • Node.js开发多进程应用

    使用child_process模块可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程之间的互相通信来实现信息的交换,多个子进程之间也可以通过共...

    用户1515472
  • 再谈Android客户端进程保活

    在很多移动应用中,特别是即时通信类项目中,保活是一个永远无法避免的一个话题。保活,按照我的理解,主要包含两部分: 网络连接保活:如何保证消息接收实时性。 ...

    xiangzhihong
  • 关于Android进程,你需要知道的

    导语 Android系统是怎样杀进程的,native进程是怎么管理的?本文为你解密 一、Android进程管理 Android是基于组件工作的,...

    MelonTeam
  • 1.并发编程多进程(理论部分)

    ​ 太白金星在一个时间段内有很多任务要做:python备课的任务,写书的任务,交女朋友的任务,王者荣耀上分的任务,  

    changxin7
  • 一篇文章搞定Python多进程(全)

    前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下:

    南山烟雨

扫码关注云+社区

领取腾讯云代金券