Хорошей практикой является загрузка файла в s3 с использованием масштабируемости и производительности nodejs. - PullRequest
3 голосов
/ 20 сентября 2019

Я использую Multer для загрузки файла в s3, и я попробовал три метода для загрузки файла в s3

  1. memoryStorage (по умолчанию)
  2. * пользовательский движок S3stroage (путем прямого вывода файла из запроса и загрузки в s3)
  3. Diskstroage (по умолчанию)

в моем случае second подход хорош с точки зрения производительности, но я думаю, что он не масштабируемый, но очень много. но второй метод экономит много времени (вместо записи на диск и последующей потоковой передачи оттуда гораздо более прямой).Не знаю, что минусы этого подхода. Кто-нибудь может предложить мне хороший подход.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2019

Вы должны рассмотреть возможность использования S3 предварительно подписанного URL

Поэтому вместо использования своего экземпляра в качестве посредника для транзакции создайте API, который позволит клиенту получать короткий-lived уникальный (прямой s3) URL , который клиент может использовать для загрузки файла непосредственно в нужное место в S3, не просматривая ваш экземпляр.Я считаю, что это более масштабируемо, чем ваши существующие решения.

Однако, есть одна оговорка.Ваш предварительно подписанный URL-адрес (как следует из названия) «предварительно аутентифицирован», будьте осторожны при передаче этой информации своему клиенту и убедитесь, что URL-адрес достаточно короткий, чтобы предотвратить дальнейшее злоупотребление.

Кроме того, вы можетенужна дополнительная реализация прослушивания события S3, если вы хотите получать уведомления, когда файлы успешно загружены в хранилище.Смотри https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

0 голосов
/ 29 сентября 2019

aws-cli отлично, но если вы беспокоитесь о масштабировании, вы можете использовать фоновые рабочие для загрузки ваших файлов в s3.во-первых, сохраните файл в DiskStorage и добавьте задание в очередь для фонового процесса, который загружает файл в aws-s3.этот метод дает вам возможность повторить загрузку в случае неудачи и удаляет ее после загрузки, оставляя вам больше свободного места.Вы можете попробовать bull (система очередей).

0 голосов
/ 28 сентября 2019

используйте aws sdk.Это быстро и безопасно.https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html

вам не нужен предопределенный URL для загрузки любого файла. Я не знаю, почему он отвечает на любой вопрос.

Всегда читать с дискового хранилища Diskstroage (по умолчанию).Если файл не прочитан полностью, вы можете повторить попытку. проверьте эти образцы github

    // Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'REGION'});

// Create S3 service object
s3 = new AWS.S3({apiVersion: '2006-03-01'});

// call S3 to retrieve upload file to specified bucket
var uploadParams = {Bucket: process.argv[2], Key: '', Body: ''};
var file = process.argv[3];

// Configure the file stream and obtain the upload parameters
var fs = require('fs');
var fileStream = fs.createReadStream(file);
fileStream.on('error', function(err) {
  console.log('File Error', err);
});
uploadParams.Body = fileStream;
var path = require('path');
uploadParams.Key = path.basename(file);

// call S3 to retrieve upload file to specified bucket
s3.upload (uploadParams, function (err, data) {
  if (err) {
    console.log("Error", err);
  } if (data) {
    console.log("Upload Success", data.Location);
  }
});
To run the example, type the following at the command line.

node s3_upload.js BUCKET_NAME FILE_NAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...