6个小技巧,为您的NodeJS准备高负载

外观相似的面部识别服务已同时为成千上万的用户提供服务。

作为一种爱好,使用NodeJS进行开发是一种乐趣,但是当涉及到许多用户的生产时,您应该了解一些事情,以避免长时间的响应和故障。


作为MyHeritage工作的一部分,我们为Eurovision 2019开发了doppelgänger服务 ,通过上传自拍照,您可以找出哪些选手与您最相似。


除了面部识别逻辑外,该应用程序还有一个非常明确的要求:它必须服务于成千上万的同时用户,因为Eurovision受到了全球数百万人的关注。


很快,我们意识到配置了Auto Scaling的应用程序前面的负载平衡器不足以实现容错能力。 以下内容对我们有很大帮助:


  1. 希望最好,但要为最坏的事情做好准备:在X时间内(一次)衡量有多少个并发用户能够为您的应用程序提供服务。 例如,在我们的案例中,测试表明,我们可以在每个EC2实例中为200个并发用户提供服务10秒钟,因此当我们发现应该为10,000个并发用户提供服务时,我们只需为平衡器准备50台服务器。 对于测试,我们使用了一个称为JMeter的出色工具。

    并且本教程在准备测量方面大有帮助。
  2. 避免使用锁:阻塞操作(如fs.readSync )很吸引人,因为代码看起来更干净,但实际上会降低性能。 请改用async / await操作,因为在异步操作期间,CPU可用于其他任务(请参阅Event Loop )。

    之前: const res = fs.readSync('file.txt');
    const res = fs.readSync('file.txt');
    之后: const res = await fs.readAsync('file.txt');
  3. 增加内存限制:默认情况下, Node配置为1 GB的限制。 如果服务器可以访问特定于您的应用程序的4 GB,则必须使用带有以下标志的CLI手动设置最大内存限制:-- --max-old-space-size
    --max-old-space-size
    示例: node --max-old-space-size=4096 server.js
  4. 确保使用所有处理器内核:默认情况下, Node在同一线程中运行。 如果您没有专门配置将运行多个线程的配置,请选择一核的服务器以节省资金。
  5. 减少对应用程序的调用次数:配置强制HTTPS和所有重定向(例如在代理级别)尽可能高。 这将使应用程序不会因多余而分散注意力,因此对于真正重要的请求更易于访问。
  6. 错误处理:使用日志记录(例如Logz.io/AWS CloudWatch)来跟踪可能导致应用程序故障的错误。 请勿报告Slack之类的服务,因为它们通常会成批散布并且很容易阻塞渠道。 我们使用了一个出色的库Winston来登录NodeJS。

在我们的案例中,这些技巧使生产率提高了十倍,即使您必须同时为成千上万的用户提供服务,也有助于保持生产环境的清洁。


感谢您的阅读。

Source: https://habr.com/ru/post/zh-CN456036/


All Articles