Performance AWS DynamoDB持久连接
给定NodeJS第6版上的AWS Lambda,该版本执行非常简单的测试目的,CRUD与DynamoDB表交互。测得的性能非常慢,与Dynamodb所选的Lambda RAM内存或RCU/WCU单元无关 进行了基准测试,结果不令人满意。微容器中的事件MySQL数据库具有一定的性能,与DynamoDB相比有一定的优势Performance AWS DynamoDB持久连接,performance,amazon-web-services,aws-lambda,amazon-dynamodb,aws-sdk,Performance,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Aws Sdk,给定NodeJS第6版上的AWS Lambda,该版本执行非常简单的测试目的,CRUD与DynamoDB表交互。测得的性能非常慢,与Dynamodb所选的Lambda RAM内存或RCU/WCU单元无关 进行了基准测试,结果不令人满意。微容器中的事件MySQL数据库具有一定的性能,与DynamoDB相比有一定的优势 Update operations 1000 10000 20000 100000 RCU=100
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)请求!()非常慢,TLS连接中的事件,建立时间比较长,包括密钥交换。此外,HTTP头的开销非常大,有时比CRUD负载大几倍
所以问题:在NodeJS Labmda中,是否有可用的方法在持久连接中与DynamoDB通信?批处理操作不是合适的解决方案,因为它们不支持更新操作。根据设计,DynamoDB是一个web服务。您不能像RDBMS或任何其他数据库那样永久连接到数据库 DynamoDB是一个web服务,与它的交互是无状态的。 应用程序不需要维护持久的网络连接。 相反,使用HTTP(S)请求和 答复 解决方案:- 如果更新不相关,则可以异步更新该项以提高性能。但是,您可能需要考虑在这种情况下如何处理错误 下面的代码在
update
上没有回调。因此,它调用更新操作,而不等待其响应
requestObj = docClient.update(params);
requestObj.send();
AWS节点SDK似乎默认支持保持活动状态。 我们需要将AWS_NODEJS_CONNECTION_REUSE_ENABLED环境变量设置为1
请参阅:-当然不能通过HTTP进行持久逻辑连接。。。但是SDK是否至少使用HTTP保持活动?这将避免大量不必要的TLS协商开销。看看源代码,我看不到它,这似乎是一个重大的设计疏忽,如果是真的,但也有一些可以修复的。你看到有人在用活命吗?这个怎么样?它似乎暗示套接字重用是可能的,但似乎没有提到默认行为。。。或者它可能会说默认值是50。不确定这里说的是什么。是的,如果说得更准确一些,就意味着像
keep alive
based这样的解决方案。但通过对awsdk
JS库的源代码研究和调试表明,实际上is不支持keep-alive
连接。AWS Dynamo桌面上的一些答案表明,它应该尊重保持活动状态选项,但在现实世界中AWS sdk
只是创建新的HTTP(S)连接。现在只看到一个明显的解决方法:为传出连接提供自定义HTTP代理,并执行手动将多个HTTP(S)请求转换为一个HTTP(S)的操作按顺序连接。在糟糕的情况下,可以编写自己的AWS API包装器,但非常奇怪的是,AWS没有实现那个极其重要的功能。您是否能够使用任何其他方法来提高性能?我也陷入了类似的境地。