许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务; 它比较适合对并发要求比较高,而且简单的业务场景。

在Express的作者的TJ Holowaychuk的 告别Node.js一文中列举了以下罪状:

Farewell NodeJS (TJ Holowaychuk)

•   you may get duplicate callbacks

•   you may not get a callback at all (lost in limbo)

•   you may get out-of-band errors

•   emitters may get multiple “error” events

•   missing “error” events sends everything to hell

•   often unsure what requires “error” handlers

•   “error” handlers are very verbose

•   callbacks suck

其实这几条主要吐嘈了两点: node.js错误处理很扯蛋,node.js的回调也很扯蛋。

事实上呢?

事实上NodeJS里程确实有“脆弱”的一面,单线程的某处产生了“未处理的”异常确实会导致整个Node.JS的崩溃退出,来看个例子, 这里有一个node-error.js的文件:

var http = require('http');var server = http.createServer(function(req, res) {//这里有个错误,params 是 undefined

var ok =req.params.ok;

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Hello World\n');

});

server.listen(8080, '127.0.0.1');

console.log('Server running at http://127.0.0.1:8080/');

启动服务,并在地址栏测试一下发现 http://127.0.0.1:8080/  不出所料,node崩溃了

$ node node-error

Server running at http://127.0.0.1:8080/

c:\github\script\node-error.js:5

var ok = req.params.ok;

^

TypeError: Cannot read property 'ok' of undefined

at Server. (c:\github\script\node-error.js:5:22)

at Server.EventEmitter.emit (events.js:98:17)

at HTTPParser.parser.onIncoming (http.js:2108:12)

at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)

at Socket.socket.ondata (http.js:1966:22)

at TCP.onread (net.js:525:27)

怎么解决呢?

其实Node.JS发展到今天,如果连这个问题都解决不了,那估计早就没人用了。

使用uncaughtException

我们可以uncaughtException来全局捕获未捕获的Error,同时你还可以将此函数的调用栈打印出来,捕获之后可以有效防止node进程退出,如:

这相当于在node进程内部进行守护, 但这种方法很多人都是不提倡的,说明你还不能完全掌控Node.JS的异常。

使用 try/catch

我们还可以在回调前加try/catch,同样确保线程的安全。

这种方案的好处是,可以将错误和调用栈直接输出到当前发生的网页上。

集成到框架中

标准的HTTP响应处理会经历一系列的Middleware(HttpModule),最终到达Handler,如下图所示:

这 些Middleware和Handler在NodeJS中都有一个特点,他们都是回调函数,而回调函数中是唯一会让Node在运行时崩溃的地方。根据这个 特点,我们只需要在框架中集成一处try/catch就可以相对完美地解决异常问题,而且不会影响其它用户的请求request。

事实上现在的NodeJS WEB框架几乎都是这么做的,如 OurJS开源博客所基于的 WebSvr

就有这么一处异常处理代码:

try{

handler(req, res);

}catch(err) {varerrorMsg= '\n'

+ 'Error ' + new Date().toISOString() + ' ' +req.url+ '\n'

+ err.stack || err.message || 'unknow error'

+ '\n';

console.error(errorMsg);

Settings.showError? res.end('

' + errorMsg + '

')

: res.end();

}

那么不在回调中产生的错误怎么办?不必担心,其实这样的node程序根本就起不起来。

此外node自带的 cluster 也有一定的容错能力,它跟nginx的worker很类似,但消耗资源(内存)略大,编程也不是很方便,OurJS并没有采用此种设计。

守护NodeJS进程和记录错误日志

现 在已经基本上解决了Node.JS因异常而崩溃的问题,不过任何平台都不是100%可靠的,还有一些错误是从Node底层抛出的,有些异常 try/catch和uncaughtException都无法捕获。之前在运行ourjs的时侯,会偶尔碰到底层抛出的文件流读取异常,这就是一个底层 libuv的BUG,node.js在0.10.21中进行了修复。

面对这种情况,我们就应该为nodejs应用添加守护进程,让NodeJS遭遇异常崩溃以后能马上复活。

另外,还应该把这些产生的异常记录到日志中,并让异常永远不再发生。

使用node来守护node

node-forever 提供了守护的功能和LOG日志记录功能。

安装非常容易

[sudo] npm install forever

使用也很简单

$ forever start simple-server.js

$ forever list

[0] simple-server.js [ 24597, 24596 ]

还可以看日志

forever -o out.log -e err.log my-script.js

使用shell启动脚本守护node

使用node来守护的话资源开销可能会有点大,而且也会略显复杂,OurJS直接在开机启动脚本来进程线程守护。

如在debian中放置的 ourjs 开机启动文件: /etc/init.d/ourjs

这个文件非常简单,只有启动的选项,守护的核心功能是由一个无限循环 while true; 来实现的,为了防止过于密集的错误阻塞进程,每次错误后间隔1秒重启服务

WEB_DIR='/var/www/ourjs'

WEB_APP='svr/ourjs.js'

#location of node you want to use

NODE_EXE=/root/local/bin/node

while true; do

{

$NODE_EXE $WEB_DIR/$WEB_APP config.magazine.js

echo "Stopped unexpected, restarting \r\n\r\n"

} 2>> $WEB_DIR/error.log

sleep 1

done

错误日志记录也非常简单,直接将此进程控制台当中的错误输出到error.log文件即可: 2>> $WEB_DIR/error.log  这一行, 2 代表 Error。

本文转自王磊的博客博客园博客,原文链接:http://www.cnblogs.com/vipstone/p/4866262.html,如需转载请自行联系原作者

node mysql崩溃_Node出错导致运行崩溃的解决方案相关推荐

  1. Node出错导致运行崩溃的解决方案

    许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在Express的作者的TJ Hol ...

  2. activex html 崩溃_网站导致浏览器崩溃的原因总结(多款浏览器)

    面试某公司的时候,面试官问到,导致浏览器崩溃的原因有哪些?愚辈不才,仅回答出了内存泄漏.其实在网页在装载的过程中,常常由于种种原因使浏览器的反映变的很慢,或造成浏览器失去响应,甚至会导致机器无法进行其 ...

  3. 记录一次mysql数据库文件损坏导致数据库崩溃

    表现: 服务器数据库查询很慢,莫名数据库服务崩溃 问题排查过程: 按照网上操作,配置my.ini ,添加error-log参数,重启mysql,查看错误日志 按照错误日志内容,搜索可能的错误问题 比如 ...

  4. node mysql 模块化_Node.js中的模块化

    每天一篇文章来记录记录自己的成长吧.大二,该静心了.加油~ 好了,废话不多说,今天说说nodejs中的模块化.(注:此文为自己对书nodejs实战的总结) nodejs一个重要的特性就是模块化,模块就 ...

  5. node mysql 查询_Node.js使用mysql进行查询详解

    本篇教程介绍了Node.js使用mysql进行查询详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 因为返回的是个对象 var selectSql1=&quo ...

  6. node mysql 模块化_Node.js 模块系统

    Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...

  7. Base64编码导致服务器崩溃

    Base64编码导致服务器崩溃 我之前提到:"使用了文本来替代二进制的协议,其中就用了base64对文本进行编码.在<一个更加的KISS设计>一文中谈到. 结果,这个base64 ...

  8. 线程崩溃必会使进程崩溃吗

    结论:线程崩溃不一定导致进程崩溃. 线程崩溃的本质就是内存出错.而内存出错有时不会引起其他线程出错的,因为崩溃的线程,也就是出错的内存有时侯没有被其他线程访问,也就不会产生问题,但有时候会打乱其他线程 ...

  9. 【解决】MySql 5.6 运行崩溃错误

    [解决]MySql 5.6 运行崩溃错误 最近弄了一台云主机,配置是20G磁盘空间,1G运行内存的Linux服务器.在上面安装了LAMP(RHEL7.2+Apache2.4+MySql5.6+PHP5 ...

最新文章

  1. 【刷题记录】杂题记录
  2. STL之七:STL各种容器的使用时机详解
  3. java面试常见问题
  4. 实例对象的属性和原型对象中的属性重名问题 神奇的原型链 继承 继承案例
  5. ElasticSearch Java Api(四) -删除索引
  6. [转]半角全角互转函数[JS版 VBS版]
  7. git设置mergetool可视化工具
  8. js路由在php上面使用,director.js实现前端路由使用实例
  9. 超级计算机手机芯片,美国开建arm超级计算机,单节点性能是手机芯片100倍
  10. python从入门到精通pdf-跟老齐学Python从入门到精通完整版PDF_Python教程
  11. SpringAop源码一:通知方法优先级
  12. VMware Workstation 14 Pro 安装 Windows Server 2003(完)
  13. Java精品源码第83期在线旅游网站系统(推荐)
  14. 糖尿病性视网膜病变分级诊断
  15. 自动驾驶寻找「商业闭环」
  16. jdbc连接mysql数据库,设置字符集编码
  17. 把字符串转换大写php,php把字符串转换为大写的函数strtoupper()
  18. SDUST 第四次作业
  19. VUE项目前端页面添加水印
  20. 期货怎么克服频繁止损(期货交易怎么止损)

热门文章

  1. Unity上的Oculus Quest2开发(1) ——首先要空工程能在Quest上跑起来吧
  2. oracle按用户采集信息,oracle 11g 手动收集用户统计信息
  3. OpenShift 4 - 用 Operator 创建 Jenkins 环境
  4. OpenShift 4 - 了解Secret
  5. .NET Core:通过Web API进行微服务交互
  6. c语言通讯录管理系统_通讯录管理系统(C语言)
  7. python正则化_Python正则表达式
  8. bootstrap验证 2021-04-21
  9. 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法
  10. tcp 四次挥手_TCP三次握手和四次挥手通俗理解