鉴于NodeJS第6版上的AWS Lambda,它与DynamoDB表执行非常简单的测试目的CRUD交互。测量的性能非常慢,独立于选定的Lambda RAM存储器或用于Dynamodb的RCU / WCU单元。
进行了基准测试,结果不满意。微容器中的事件MySQL数据库具有性能,与DynamoDB相比有一段时间更好。
Update operations 1000 10000 20000 100000
RCU=1000/WCU=1000 104708 ms 176109 ms 276689 ms N/A >5min
942 MB 707 MB 896 MB
RCU=2000/WCU=2000 45953 ms 167686 ms 245937 ms N/A >5min
646 MB 829 MB 896 MB
RCU=3000/WCU=3000 74205 ms 151072 ms 253800 ms N/A >5min
657 MB 840 MB 854 MB
RCU=4000/WCU=4000 76636 ms 175258 ms 257238 ms N/A >5min
896 MB 896 MB 896 MB
发现此类行为的快速研究原因后:DynamoDB对每个CRUD操作执行新的HTTP(S)请求! (https://github.com/aws/aws-sdk-js/blob/master/lib/http/node.js#L25)这是一个非常慢的TLS连接事件,它具有相对较长的建立时间,包括密钥交换。此外,它对HTTP标头来说是非常大的开销,有时比CRUD有效载荷大一些。
所以问题:是否有可用的方法在NodeJS Labmda的持久连接中与DynamoDB进行通信?批处理操作不是合适的解决方案,因为它们不支持UPDATE操作。
答案 0 :(得分:0)
根据设计,DynamoDB是一种Web服务。您不能像RDBMS或任何其他数据库那样持久连接数据库。
DynamoDB是一种Web服务,与它的交互是无状态的。 应用程序不需要维护持久的网络连接。 相反,使用HTTP(S)请求和DynamoDB进行交互 响应。
解决方法解决方案: -
如果更新不相关,您可以异步更新项目以提高性能。但是,在这种情况下,您可能需要考虑如何处理错误。
以下代码在update
上没有回调。因此,它调用更新操作并且不等待其响应。
requestObj = docClient.update(params);
requestObj.send();
答案 1 :(得分:0)
默认情况下,AWS Node SDK似乎支持Keep-alive。 我们需要将AWS_NODEJS_CONNECTION_REUSE_ENABLED环境变量设置为1。
请参考:-https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html