Node.js如何处理服务器的下拉?

时间:2018-01-31 16:44:51

标签: javascript node.js

在Node.js api上有很多if和一个可以轻松发送带有一些未定义var的请求并使整个服务器崩溃,直到它再次重新启动 - 这可能需要20秒。

我知道在使用它之前应该检查一个变量是否已定义。但它很容易忘记一些东西并继续使用未定义的var。

服务器是否有全局定义以避免出现下拉?

3 个答案:

答案 0 :(得分:2)

在任何应用程序中都有很多" ifs"和假设。使用JavaScript,弱类型和动态,你可以真正射击自己。

但是同样的规则适用于任何其他语言。练习defensive programming。也就是说,覆盖所有每个函数和语句块中的基础。

您还可以使用programming Nodejs试用Typescript。它会广告一些静态类型检查和其他很好的功能,可以帮助你在拍摄时错过你的脚。您也可以使用(我认为)Flow来静态输入检查内容。但这些不会让你成为更好的程序员。

另一个建议是将您的系统设计为SOA。因此,一部分下降并不一定会影响其他部分。 "微服务"作为其中的一个子集。

答案 1 :(得分:2)

我能想到的最简单的解决方案是实现一个集群,其中只有一个进程会关闭,而不是整个服务器。您还可以使该过程自动重新启动。 See more here

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

答案 2 :(得分:1)

首先,防御性编程和广泛测试是你的朋友。显然,在问题发生之前预防问题比在问题发生后对其做出反应要好得多。

其次,没有万无一失的机制可以捕获某些高级别的所有异常,然后将服务器恢复到已知的安全状态。你无法在任何复杂的服务器中真正做到这一点,因为你不知道在发生异常的过程中你是什么。人们经常会尝试这样做,但这就像继续受伤的服务器,可能会有一些混乱的内部。这不安全或不可取。如果问题没有被知道如何正确处理该情况的代码在其发生的级别上截获(例如异常捕获或检测到错误),则唯一完全安全的路径是重新启动服务器。

因此,如果在尽可能多地实施防御性编程并测试其中之后,您仍然希望防止最终用户因服务器崩溃/重启而停机,那么最好的方法就是假设有时需要重新启动给定的服务器进程并为此计划。

在服务器进程重新启动时防止最终用户停机的最简单方法是使用群集,因此多个服务器进程使用某种负载均衡器来监控服务器处理和路由健康服务器进程之间的传入连接。当一个服务器进程关闭时,它将暂时退出轮换,其他服务器进程可以处理新的传入连接。成功重新启动失败的服务器进程后,可以将其添加回轮换并再次用于新请求。以这种方式进行集群可以在单个服务器(同一服务器上的多个进程)或跨服务器(多个服务器,每个服务器上都有服务器进程)内完成。

在某些情况下,甚至可以使用相同的流程推出新版本的服务器代码,而不会出现任何系统停机(这样做需要额外的计划)。