【问题标题】:AWS DynamoDB persistent connectionAWS DynamoDB 持久连接
【发布时间】:2018-07-17 13:00:17
【问题描述】:

给定 AWS Lambda on NodeJS 第 6 版,它与 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 操作。

【问题讨论】:

  • 您是否能够使用任何其他方法来提高性能?我陷入了类似的境地。

标签: performance amazon-web-services aws-lambda amazon-dynamodb aws-sdk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    按照设计,DynamoDB 是一种 Web 服务。您不能与 RDBMS 或任何其他数据库等数据库建立持久连接。

    DynamoDB 是一种 Web 服务,与它的交互是无状态的。 应用程序不需要维护持久的网络连接。 相反,与 DynamoDB 的交互使用 HTTP(S) 请求和 回复。

    Dynamodb connection

    解决方法:-

    如果更新不相关,您可以异步更新项目以提高性能。但是,您可能需要考虑在这种情况下您希望如何处理错误。

    下面的代码在update 上没有回调。因此,它调用更新操作并且不等待它的响应。

    requestObj = docClient.update(params);
    requestObj.send();
    

    【讨论】:

    • 持久的逻辑连接当然不可能通过HTTP...但是SDK至少不使用HTTP keep-alive吗?这将避免大量不必要的 TLS 协商开销。查看源代码,我看不到它,这似乎是一个重大的设计疏忽,如果属实,但也是可以修复的。你看到有人在使用保活吗?
    • 这个怎么样?它似乎暗示套接字重用是可能的,但似乎没有提及默认行为。 docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/…... 或者说默认是 50。不知道这里说的是什么。
    • 是的,如果更准确的话,是指基于keep-alive 的解决方案。但是通过aws-sdk JS库研究源代码和调试表明,实际上不支持keep-alive连接。 AWS Dynamo 桌面上的一些答案显示,它应该尊重 keep-alive 选项,但在现实世界中 aws-sdk 只是创建新的 HTTP(S) 连接。
    • 现在只看到一个明显的解决方法:为传出连接提供自定义 HTTP 代理,并执行手动将多个 HTTP(S) 请求依次转换为一个 HTTP(S) 连接。在不好的情况下,可以编写自己的 AWS API 包装器,但很奇怪,AWS 没有实现那个极其重要的功能
    猜你喜欢
    • 2017-07-12
    • 2021-05-06
    • 2011-03-29
    • 2011-01-16
    • 2013-01-22
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多