【问题标题】:How to keep server and application separate如何保持服务器和应用程序分开
【发布时间】:2014-05-07 13:28:32
【问题描述】:

我有一个 nodejs 应用程序在使用 node-mysql 和 express 的服务器上运行,起初我遇到了一些异常没有处理的问题,并且应用程序会因网络连接问题而关闭。

我处理了所有未捕获的异常,这次服务器不会关闭,而是会挂起。我想这是因为我只有在查询没有引发任何异常时才返回响应,所以我也处理了所有与查询相关的异常。

接下来,如果 MySQL 服务器由于某种原因终止连接,我的应用程序不会重新连接,我尝试重新连接,但它会给出与“排队连接握手或其他东西”相关的错误。从另一个堆栈问题我应该使用连接池,所以如果服务器终止连接,它将以某种方式重新获得连接,我这样做了。

我的问题是,每次我遇到问题时,我都必须关闭整个应用程序,并且感谢 nodejs 以编程方式配置服务器的地方也出现故障。我可以或者更好的是如何将我的服务器和应用程序几乎完全解耦,这样如果我对我的应用程序进行一些更改,我就不必重新部署?

特别是如果现在一切正常并且我的应用程序在服务器上不断给我连接池错误,而在开发版本中它工作正常,所以即使我重新启动我的应用程序我也不确定我将如何再次面对这个问题所以我可以正确诊断。

如果有人需要关于我的问题的更多信息,请告诉我。

【问题讨论】:

    标签: mysql node.js architecture


    【解决方案1】:

    您是使用前端框架为您的应用程序提供服务,还是全部通过服务器调用提供服务?

    因此,从根本上说,如果您的服务器因任何原因(即 500 错误)而中断,您希望关闭并重新启动,因为一旦您的服务器处于该状态,您所有的传输数据和堆栈都处于未知状态状态。无法从中正确恢复,因此从服务器和最终用户的角度来看,关闭进程并重新启动会更安全。

    您可以通过使用 Node 的 Cluster 模块之类的东西来最小化这种影响,它允许您分叉服务器的子进程并生成同一服务器的多个实例,连接到同一数据库,允许访问同一端口等,因此,如果您的用户(或您的服务器)设法遇到未处理的异常,它可以终止进程并重新启动,而无需关闭整个服务器。

    编辑:这是一个 sn-p:

    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 中的连接池:我从未使用过那个模块,所以我不能说那里有什么最佳实践。

    【讨论】:

    • 我没有使用集群模块让我看看它是如何工作的。
    • 我添加了一个简短的 sn-p,它很容易设置,您只需要确保您的异常正在抛出 process.exit 以便它触发集群上的退出侦听器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多