在亚马逊lambda,并行调整多个缩略图大小asynchronous抛出错误:stream产生空的缓冲区

我已经调整了在lambda中调整照片大小的Amazon示例以创build多个缩略图大小并行运行。

我的代码在几秒钟内在本地运行良好,但在lambda云中,它不会并行运行,并在调整第一个缩略图大小后引发错误。如果将其切换为串行而不是并行,则需要大约60秒连续运行。

为什么会在lambda中并行运行resize的代码会导致stream产生空的缓冲区错误。 如何提高性能,以便在几秒钟内创build尺寸,但是在处理器成本方面仍然可以获得良好的价值和效率。

// dependencies var async = require('async'); var AWS = require('aws-sdk'); var gm = require('gm') .subClass({ imageMagick: true }); // Enable ImageMagick integration. var util = require('util'); // constants var SIZES = [100, 320, 640]; // get reference to S3 client var s3 = new AWS.S3(); exports.handler = function(event, context) { // Read options from the event. console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); var srcBucket = event.Records[0].s3.bucket.name; var srcKey = event.Records[0].s3.object.key; var dstBucket = srcBucket + "-resized"; // Infer the image type. var typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.error('unable to infer image type for key ' + srcKey); return context.done(); } var imageType = typeMatch[1]; if (imageType != "jpg" && imageType != "png") { console.log('skipping non-image ' + srcKey); return context.done(); } // Sanity check: validate that source and destination are different buckets. if (srcBucket == dstBucket) { console.error("Destination bucket must not match source bucket."); return context.done(); } // Download the image from S3 s3.getObject({ Bucket: srcBucket, Key: srcKey }, function(err, response){ if (err) return console.error('unable to download image ' + err); var contentType = response.ContentType; var original = gm(response.Body); original.size(function(err, size){ if(err) return console.error(err); //transform, and upload to a different S3 bucket. async.each(SIZES, function (max_size, callback) { resize_photo(size, max_size, imageType, original, srcKey, dstBucket, contentType, callback); }, function (err) { if (err) { console.error( 'Unable to resize ' + srcBucket + ' due to an error: ' + err ); } else { console.log( 'Successfully resized ' + srcBucket ); } context.done(); }); }); }); }; //wrap up variables into an options object var resize_photo = function(size, max_size, imageType, original, srcKey, dstBucket, contentType, done) { var dstKey = max_size + "_" + srcKey; // transform, and upload to a different S3 bucket. async.waterfall([ function transform(next) { // Infer the scaling factor to avoid stretching the image unnaturally. var scalingFactor = Math.min( max_size / size.width, max_size / size.height ); var width = scalingFactor * size.width; var height = scalingFactor * size.height; // Transform the image buffer in memory. original.resize(width, height) .toBuffer(imageType, function(err, buffer) { if (err) { next(err); } else { next(null, buffer); } }); }, function upload(data, next) { // Stream the transformed image to a different S3 bucket. s3.putObject({ Bucket: dstBucket, Key: dstKey, Body: data, ContentType: contentType }, next); } ], function (err) { console.log('finished resizing ' + dstBucket + '/' + dstKey); if (err) { console.error(err) ; } else { console.log( 'Successfully resized ' + dstKey ); } done(err); } ); }; 

今晚我刚碰到同样的问题。

尽pipe可能还有别的事情可做,但是我更新了lambda任务的内存,缓冲区问题就消失了。

我将2.1mb和5000×3000的图像调整为3个较小的尺寸。

持续时间:11619.86毫秒计费时间:11700毫秒内存大小:1024 MB使用的最大内存:582 MB

希望有所帮助