node mysql崩溃_Node出错导致运行崩溃的解决方案
许多人都有这样一种映像,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出错导致运行崩溃的解决方案相关推荐
- Node出错导致运行崩溃的解决方案
许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在Express的作者的TJ Hol ...
- activex html 崩溃_网站导致浏览器崩溃的原因总结(多款浏览器)
面试某公司的时候,面试官问到,导致浏览器崩溃的原因有哪些?愚辈不才,仅回答出了内存泄漏.其实在网页在装载的过程中,常常由于种种原因使浏览器的反映变的很慢,或造成浏览器失去响应,甚至会导致机器无法进行其 ...
- 记录一次mysql数据库文件损坏导致数据库崩溃
表现: 服务器数据库查询很慢,莫名数据库服务崩溃 问题排查过程: 按照网上操作,配置my.ini ,添加error-log参数,重启mysql,查看错误日志 按照错误日志内容,搜索可能的错误问题 比如 ...
- node mysql 模块化_Node.js中的模块化
每天一篇文章来记录记录自己的成长吧.大二,该静心了.加油~ 好了,废话不多说,今天说说nodejs中的模块化.(注:此文为自己对书nodejs实战的总结) nodejs一个重要的特性就是模块化,模块就 ...
- node mysql 查询_Node.js使用mysql进行查询详解
本篇教程介绍了Node.js使用mysql进行查询详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 因为返回的是个对象 var selectSql1=&quo ...
- node mysql 模块化_Node.js 模块系统
Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...
- Base64编码导致服务器崩溃
Base64编码导致服务器崩溃 我之前提到:"使用了文本来替代二进制的协议,其中就用了base64对文本进行编码.在<一个更加的KISS设计>一文中谈到. 结果,这个base64 ...
- 线程崩溃必会使进程崩溃吗
结论:线程崩溃不一定导致进程崩溃. 线程崩溃的本质就是内存出错.而内存出错有时不会引起其他线程出错的,因为崩溃的线程,也就是出错的内存有时侯没有被其他线程访问,也就不会产生问题,但有时候会打乱其他线程 ...
- 【解决】MySql 5.6 运行崩溃错误
[解决]MySql 5.6 运行崩溃错误 最近弄了一台云主机,配置是20G磁盘空间,1G运行内存的Linux服务器.在上面安装了LAMP(RHEL7.2+Apache2.4+MySql5.6+PHP5 ...
最新文章
- 【刷题记录】杂题记录
- STL之七:STL各种容器的使用时机详解
- java面试常见问题
- 实例对象的属性和原型对象中的属性重名问题 神奇的原型链 继承 继承案例
- ElasticSearch Java Api(四) -删除索引
- [转]半角全角互转函数[JS版 VBS版]
- git设置mergetool可视化工具
- js路由在php上面使用,director.js实现前端路由使用实例
- 超级计算机手机芯片,美国开建arm超级计算机,单节点性能是手机芯片100倍
- python从入门到精通pdf-跟老齐学Python从入门到精通完整版PDF_Python教程
- SpringAop源码一:通知方法优先级
- VMware Workstation 14 Pro 安装 Windows Server 2003(完)
- Java精品源码第83期在线旅游网站系统(推荐)
- 糖尿病性视网膜病变分级诊断
- 自动驾驶寻找「商业闭环」
- jdbc连接mysql数据库,设置字符集编码
- 把字符串转换大写php,php把字符串转换为大写的函数strtoupper()
- SDUST 第四次作业
- VUE项目前端页面添加水印
- 期货怎么克服频繁止损(期货交易怎么止损)
热门文章
- Unity上的Oculus Quest2开发(1) ——首先要空工程能在Quest上跑起来吧
- oracle按用户采集信息,oracle 11g 手动收集用户统计信息
- OpenShift 4 - 用 Operator 创建 Jenkins 环境
- OpenShift 4 - 了解Secret
- .NET Core:通过Web API进行微服务交互
- c语言通讯录管理系统_通讯录管理系统(C语言)
- python正则化_Python正则表达式
- bootstrap验证 2021-04-21
- 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法
- tcp 四次挥手_TCP三次握手和四次挥手通俗理解