-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use Connection: keep-alive to improve application performance #2571
Comments
Changing the default behavior here could introduce issues for existing users of the SDK. If this were enabled by default, it would require a major version bump. It is possible to enable keep-alive through configuration. That can be done on the global config:
Or on a per-client basis:
|
Greetings! We’re closing this issue because it has been open a long time and hasn’t been updated in a while and may not be getting the attention it deserves. We encourage you to check if this is still an issue in the latest release and if you find that this is still a problem, please feel free to comment or open a new issue. |
The AWS SDK variant that is available by default on Lambda runtime's is v2. This version creates and closes a new TCP connection for each network request. For backwards compatibility reasons, they didn't change that default behavior in v2[0], but they did in v3[1]. However, this can be manually set in by passing in a configured http Agent to the AWS SDK with `keepAlive` set to `true` or by simply setting the `AWS_NODEJS_CONNECTION_REUSE_ENABLED` environment variable[2]. While this shouldn't really impact cold starts much, the performance difference when measuring warm starts can be pretty significant. This is a relevant excerpt from the AWS documentation: > By default, the default Node.js HTTP/HTTPS agent creates a new TCP > connection for every new request. To avoid the cost of establishing a > new connection, you can reuse an existing connection. > > For short-lived operations, such as DynamoDB queries, the latency > overhead of setting up a TCP connection might be greater than the > operation itself. Additionally, since DynamoDB encryption at rest is > integrated with AWS KMS, you may experience latencies from the > database having to re-establish new AWS KMS cache entries for each > operation. [0]: aws/aws-sdk-js#2571 [1]: https://aws.amazon.com/blogs/developer/http-keep-alive-is-on-by-default-in-modular-aws-sdk-for-javascript/ [2]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html
Just to understand the difference |
By default, NodeJS sets
Connection: close
and notConnection: keep-alive
HTTP header which results in sub-optimal performance. Instead of reusing an already established connection between the client and the service, a new one has to be created for every operation.It has been reported before (#146), recently publicized by an AWS Serverless Hero and it's also recommended by AWS for DynamoDB when using encryption at rest. DynamoDB itself responds with a
Connection: keep-alive
header.Even though all these examples pertain to DynamoDB, I imagine other services will benefit from this change as well. For what it's worth, boto3, the official AWS SDK for Python does not explicitly set a
Connection: close
header.Please consider setting keep-alive header the on the SDK level so that going forward, the whole community can benefit from this improvement.
The text was updated successfully, but these errors were encountered: