【问题标题】:Should 'new AWS.S3' instance be a global variable or should a separate AWS.S3 instance be placed in each route?'new AWS.S3' 实例应该是一个全局变量还是应该在每条路由中放置一个单独的 AWS.S3 实例?
【发布时间】:2021-04-25 12:36:19
【问题描述】:

环境: Node.js、Express、AWS-SDK

目前我的AWS.S3 实例是位于我的中间件顶部的全局变量。

const s3 = new AWS.S3({
    apiVersion: '2006-03-01',
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
    region: process.env.S3_REGION
});

app.get('/page1', function(req, res) {
});

app.get('/page2', function(req, res) {
});

我在各种不同的路线中使用AWS.S3。 我在后台异步使用deleteObject()upload() 方法。不过,我也将headObject()async/await 一起使用,因为我需要结果才能进行下一个操作。

为了避免某种类型的S3 冲突或其他意外问题,我应该在每个中间件的顶部放置一个AWS.S3 的新实例吗?我不确定这是否有必要。与Mongoose 相比,它只需要一个语句mongoose.connect() 并打开一个包含5 个连接的池,可供应用程序中的每条路由使用。

app.get('/', function(req, res) {

    const s3 = new AWS.S3({
        apiVersion: '2006-03-01',
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
        region: process.env.S3_REGION
    });

});

app.get('/page2', function(req, res) {

    const s3 = new AWS.S3({
        apiVersion: '2006-03-01',
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
        region: process.env.S3_REGION
    });

});

【问题讨论】:

    标签: node.js amazon-web-services express aws-sdk


    【解决方案1】:

    最好共享一个具有多个功能的 S3 实例。 S3 库(实际上是 node.js 本身)已经可以处理到 S3 的多个连接。如果您需要更改某些内容,单个实例将使用更少的 RAM 并减少潜在的错误(它可以防止需要在整个地方进行更改)。

    确实,理想情况下,应该在所有文件中使用单个 S3 实例。我通常在自己的模块中初始化 S3,然后导出实例。

    例子:

    // lib/s3.js
    
    const s3 = new AWS.S3({
     apiVersion: '2006-03-01',
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
        region: process.env.S3_REGION
    });
    
    module.exports = s3;
    

    然后在我的其他代码中:

    const s3 = require('./lib/s3');   
    
    app.get('/page1', function(req, res) {
    });
    
    app.get('/page2', function(req, res) {
    });
    

    【讨论】:

    • 感谢您提供的重要信息。本文讨论设置最大套接字数。 docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/… 在底部它说,“如果 maxSockets 值未定义或为 Infinity,则 SDK 假定 maxSockets 值为 50。”您知道这是否普遍适用于 AWS-SDK,还是我查看的信息有误?
    • 这是 AWS 开发工具包的事情。其他请求可能会排队。 maxSockets 是您可以在 S3 上执行的并行操作数。
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2014-10-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多