美文网首页
Nodejs 优雅退出

Nodejs 优雅退出

作者: 黑曼巴yk | 来源:发表于2019-10-04 12:58 被阅读0次

前言

我们在Nodejs业务逻辑复杂的时候,很难做到完全没有内存泄漏,和出现uncaughtException的异常情况。这时候,偷懒的办法就是让服务进程再超过一定内存阈值时候进行重启。

直接kill进程的方法是不推荐的,因为会影响正在处理中的request。在处理cluster模式下,node对每一个fork出的子进程提供了优雅退出方式

cluster.worker.disconnect()

他会保证子进程退出前处理所有正在进行中的request。

Nodejs在内存超限时重启

//in memory.js

var cluster = require('cluster');
var usage = require('usage');
var os = require('os');

var CPU_COUNT = process.env.CPU_COUNT;
var CHECK_INTERVAL = process.env.CHECK_INTERVAL;

var cpuCount = CPU_COUNT || os.cpus().length;
var checkInterval = CHECK_INTERVAL || 5000;

module.exports = {
    run: function(bytes, runFunc, cleanFunc) {

        if (cluster.isMaster) {
            for (var i = 0; i < cpuCount; i++) {
                cluster.fork();
            }
            // isSuicide来判断进程是否是意外退出
            cluster.on('disconnect', function(worker) {
                console.log('' + worker.id + ' disconnect, restart now');
                worker.isSuicide = true;
                cluster.fork();
            });
            cluster.on('exit', function(worker) {
                if (worker.isSuicide) {
                    console.info('process exit by kill');
                } else {
                    console.info('process exit by accident');
                    cluster.fork();
                }
                console.info('process exit');
            });
        } else {

            runFunc && runFunc();

            var checkTimer = setInterval(function() {

                usage.lookup(process.pid, function(err, result) {

                    if (result === null || result === undefined) {
                        console.log("memory check fail");
                        return;
                    }
                    if (parseInt(result.memory) > bytes) {
                        console.log("memory exceed, start to kill");

                        //注意点A
                        var killtimer = setTimeout(function() {
                            console.info("process down!")
                            process.exit(1);
                        }, 5000);
                        killtimer.unref();

                        cleanFunc && cleanFunc();

                        try {
                            if (['disconnected', 'dead'].indexOf(cluster.workder.state) < 0) {
                                cluster.worker.disconnect();
                            }
                        } catch (err) {};

                        clearInterval(checkTimer);
                    }
                });

            }, checkInterval);
        }

    }
}

Nodejs在遇到未知的错误时候优雅重启

请使用graceful模块。

相关文章

  • Nodejs 优雅退出

    前言 我们在Nodejs业务逻辑复杂的时候,很难做到完全没有内存泄漏,和出现uncaughtException的异...

  • docker 优雅退出

    本文主要阐述如何让 docker 容器优雅的终止。 优雅退出定义 所谓优雅退出,指的是程序在退出之前,有清理资源、...

  • Nodejs包之graceful-process 进程优雅退出

    linux杀死进程 我们常用的进程杀死信号有:SIGKILL, SIGTERM,其中SIGKILL的信号是不能被程...

  • JVM优雅退出

    背景 在某个Java应用增加新功能,缩容机器,或者应用以及机器发生异常,通常会停止正在运行的应用,该应用通常正在运...

  • SpringBoot 优雅退出

    欢迎转载,但请在开头或结尾注明原文出处【blog.chaosjohn.com】[https://blog.chao...

  • Java 优雅退出

    前言 先思考几个问题 Java 服务为什么会挂掉? 什么情况 Java 进程会挂掉? Java 进程挂掉如何做优雅...

  • 如何优雅的退出 App ?这样优雅的退出 App !

    只需要下面这行代码(肯定还有其他的代码),当然,这是有限制的(。﹏。),而且只是退出当前的 task 而已! Ba...

  • 阿里云服务器,nodejs版本升级

    1.连接服务器升级nodejs 2.修改nodejs路径 打开内容如下 添加如下代码到文件倒数第二行位置 保存退出...

  • 获取 NodeJS 程序退出码

    前言 想要退出正在运行的 NodeJS 程序,我们既可以通过 Ctrl + C 的方式,也可以通过process...

  • go程

    golang里捕获进程信号实现优雅退出的方法 一、定时与 同步退出 二、锁 互斥锁Mutex Lock,UnLock

网友评论

      本文标题:Nodejs 优雅退出

      本文链接:https://www.haomeiwen.com/subject/oszjpctx.html