进程

子进程

进程安全

进程安全的意义: 出现 XX,重启, 保证服务正常运作
防止重启时, 请求中断, 需要做好一场处理和安全保护。
防止服务器异常退出, 及时捕获错误

  • 逻辑代码异常(js单线程、js是弱类型语言)
  • 内存泄露/溢出
    • 设置最大临时缓存数,超出则不使用缓存;
    • 设置最大缓存句柄数,超出则不使用缓存;
    • 定时清理当前的临时缓存和句柄缓存
  • I/O句柄没有及时释放

    代码异常

[p2]进程 - 图1

null.property

  • lodash 中 _.get( , 0) 异常, 返回默认值
  • 2020新增?
  • if () 提前判断

parameters error

JOSN.parse 容易忽略非JSON字符串的问题。解决方案:try catch 异常判断

  1. let str = 'nodejs';
  2. let obj = JSON.parse(str);

image.png
fs异常, 采用try…catch

内存泄露/溢出

全局变量
单例模块中的变量

  1. let singleton;
  2. const userList = [];
  3. class Singleton {
  4. add(uid) {
  5. userList.push(uid);
  6. }
  7. getLength() {
  8. return userList.length;
  9. }
  10. }
  11. module.exports = () => {
  12. if (singleton) {
  13. return singleton;
  14. }
  15. singleton = new Singleton();
  16. return singleton;
  17. };

I/O句柄没有及时释放

1. 主动关闭

一般打开文件句柄后,我们都应该主动关闭,如果未主动关闭,就会导致文件句柄越来越多,从而引发句柄泄漏问题

  • fs.open/fs.close
  • fs.createWriteStream/fileStream.end

    2. 网络句柄(复用句柄、连接超时控制)

    3. 监控告警

    告警信息异步发送到采集服务, 落地到本地临时缓存, 定时发送给监控数据处理服务。

  • 自动定时**采集进程的指标数据**

  • 接口**被调用或者访问后主动上报的信息**

监控数据处理后, 要求落入监控平台的数据存储中。

  • 触发告警,根据告警平台的设置,当数据落入后判断是否满足告警机制,满足则调用告警模块触发告警;
  • 查询视图,这部分就是一个前端可交互的界面,用户可以在这个平台查询监控信息;
  • API 接口,有些情况需要针对告警进行一些研发操作,因此也支持 API 来查询监控告警信息。

image.png

平台

付费:PM2、
一套组合系统Grafana(主要是监控系统界面操作平台)+InfluxDB(数据存储)+telegraf(数据采集)
**

性能指标

nodejs性能指标

事件延迟(例1000ms)

CPU使用率(长期70%,考虑扩容)

内存变化(达到内存上限, 重启会中断请求)

句柄变化(达到上限导致系统性能损耗、无法开启新句柄)

进程异常重启次数

业务层面(响应速度)

接口名称(唯一性)

请求服务服务器时间(点)

请求用户分类标识(设备、地区、网络运营商、版本信息)

请求耗时(内部逻辑耗时、存储服务耗时)

当前服务IP(负载均衡)