Performance AWS 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

给定NodeJS第6版上的AWS Lambda,该版本执行非常简单的测试目的,CRUD与DynamoDB表交互。测得的性能非常慢,与Dynamodb所选的Lambda RAM内存或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)请求!()非常慢,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没有实现那个极其重要的功能。您是否能够使用任何其他方法来提高性能?我也陷入了类似的境地。