我有一个nodejs应用程序在带有node-mysql和express的服务器上运行,起初我遇到了一些问题,其中没有处理一些异常,应用程序会因网络连接问题而崩溃。
我处理了所有未被捕获的异常,而且这次服务器不会停机,但它会挂起。我认为这是因为我只是在查询没有引发任何异常时才返回响应,所以我也处理了所有与查询相关的异常。
接下来,如果MySQL服务器由于某种原因终止连接,我的应用程序将不会重新连接,我尝试重新连接,但它会产生与"排队连接握手有关的错误等等#34;。从另一个堆栈问题我应该使用连接池,所以如果服务器终止连接它会重新连接一些如何,我做了。
我的问题是,每次遇到问题时,我都必须关闭整个应用程序,并且感谢nodejs,其中以编程方式配置服务器也是如此。我可以或者更好的是如何几乎完全解耦我的服务器和应用程序,这样如果我对我的应用程序进行一些更改,我就不必重新部署了?
特别是对于现在一切正常的情况,我的应用程序不断给我服务器和开发版本中的连接池错误它工作正常,所以即使我重新启动我的应用程序我不知道我将如何再次面对这个问题所以我可以正确诊断这个。
如果有人需要有关我的问题的更多信息,请告诉我。
答案 0 :(得分:1)
您是使用前端框架来为您的应用程序提供服务,还是通过服务器调用提供服务?
所以从根本上说,如果您的服务器出于任何原因(即500错误)barfs,您想要关闭并重新启动,因为一旦您的服务器处于该状态,您的所有传输中数据和您的堆栈都是未知的州。无法从中正确恢复,因此从服务器和最终用户的角度来看,您可以更安全地关闭进程并重新启动。
您可以通过使用Node的群集模块来最小化此影响,该模块允许您分叉服务器的子进程并生成连接到同一数据库的同一服务器的多个实例,从而允许访问因此,如果您的用户(或您的服务器)设法遇到未处理的异常,它可以终止进程并重新启动,而无需关闭整个服务器。
编辑:这是一个片段:
var cluster = require('cluster');
var threads = require('os').cpus().length;
if(cluster.isMaster) {
for(var i = 0; i < threads; i++) {
cluster.fork();
}
cluster.on('exit', function(dead, code, signal) {
console.log('worker ' +dead.process.pid+ ' died.');
var worker = cluster.fork();
console.log('worker '+worker.process.pid+ ' started');
});
} else {
//
// do your server logic in here
}
话虽如此,如果Node正在为您的客户端内容提供服务,那么您无法单独运行您的应用程序和服务器。终止服务器后,您的终端将关闭。如果您真的希望能够保持客户端应用程序处于活动状态并重新启动服务器,那么您必须完全分离逻辑,即将您的应用程序放在与服务器不同的项目中,并将您的服务器用作API仅限终点。
至于Node-mysql中的连接池:我从未使用过该模块,所以我无法说出最佳实践。