高性能nodejs microService在AWS中

三个简单的提示,在休息服务中充分利用AWS

开箱即用,AWS SDK为NodeJS执行合理性,但对高负荷的主观服务通常可以揭示一些不足之处。具体而言,间歇连接超时和响应延迟可以触发警报和最终挫败最终用户。以下策略不仅减轻了这些问题,而且在Realtor.com中展开了对董事会的关键服务的意外提升了性能,其平均每秒〜400请求。

1:设置AWS API超时和重试

默认情况下,NodeJS中的AWS服务调用的全局超时为120秒,并且默认重试次数因服务而异。鉴于Realtor.com的大多数服务旨在以少于100毫秒返回结果,此默认值比所需的多个数量级。

除了全局超时是另一个重试的设置,虽然没有合理的超时值,但重试无关紧要,因为在遇到第一次超时之前已经关闭了原始连接。对于这种特殊的服务,我们观察了一个AWS SDK超时,每天大约是两次,这很不常见,但尽管如此,对某些用户肯定会令人沮丧。

幸运的是,AWS提供了一种简单的方法来在所有环境中全局指定这些设置,包括nodejs:

  import * as AWS from 'aws-sdk';
 
  AWS.config.update({
    maxRetries: 4,
    httpOptions: {
      timeout: 5000,
      connectTimeout: 1000
    }
  });

// Sample code for setting AWS SDK global configuration options

由于这些是全局设置,建议将其放在服务启动代码的适当引导部分中。应用此设置后,最长的交易小于6秒,这不是理想的,但远远超过时机。重要的是不要使这个设置过于侵略性,因为可能存在具有大延迟的罕见(但正常)的API访问权限。

2:启用连接重用

此设置更适合提高DynamoDB Access,但也影响所有AWS SDK网络行为。 as for nodejs的AWS SDK的2.463.0版本,支持名为的环境变量aws_nodejs_connection_reuse_enabled.. 当此变量设置为时“1”,来自AWS SDK的TCP客户端连接重复使用,在某些情况下,在某些情况下可以通过减少任何所需的连接引导映射来显着影响性能,例如建立用于DynamoDB访问的KMS缓存条目。

在设置aws_nodejs_connection_reuse_enabled之前

对于这种特殊的服务,DynamoDB交易时间被切入一半,这导致总延迟的显着降低。

将aws_nodejs_connection_reuse_enabled设置为“1”之后

3:使用ALB / ELB超时对齐HTTP连接超时

一个经常被忽视的一个设置是与服务器保持连接的持续时间。默认情况下,ALB将重用与后端服务的连接以提高延迟。但是,如果服务器突然关闭连接,则在尝试发送数据并遇到闭合连接时,ALB将向客户端返回502个错误。由于此错误仅发生在ALB侧,因此可能难以检测到服务器上没有迹象,因此出现问题发生了问题,这导致依赖客户端报告错误的不期望的方案。

为了减轻这个,AWS.推荐将服务器的保留保持一定体超时为大于ALB空闲超时的值。 幸运的是,这是一个相对简单的设置,适用于大多数流行的nodejs服务器环境:

const express = require('express');
const app = express();
const server = app.listen(8000);
 
server.keepAliveTimeout = 61000;

// Setting Keep Alive Timeout in ExpressJS
const Hapi = require('hapi');
 
const server = Hapi.server({ port: 8000 });
server.listener.keepAliveTimeout = 61000;

// Setting Keep Alive Timeout in HapiJS

概括

应用这些设置后,将此特定服务的性能提高到3倍,并消除了所有ALB错误。一如既往地,调整的有效性最终取决于特定服务的性质,包括其性能特征,以及AWS API的利用。在任何情况下,它是一个有用的练习,用于检查任何服务的这些参数,以确保它最佳地运行。