AWS Lambda(node.js)でmapとPromise.allで並列実行する
S3にputObjectする処理をする場合にコーディングによっては処理が遅くなってしまうケースがあります。
await S3.putObject(params1).promise() await S3.putObject(params2).promise() await S3.putObject(params3).promise() await S3.putObject(params4).promise()
node.jsは非同期処理の為、大量にawaitすると同期してしまうので処理が遅くなってしまいます。
こういう同期する処理はPromise.allとmapを使って以下のように書くと並列処理を行ってくれるので、処理速度が速くなります。
const arr = ['aaa', 'bbb', 'ccc', 'ddd'] await Promise.all( arr.map(async data => { await S3.putObject( { 'Bucket': 'bucketname', 'Key': 'var/db/apps/' + data + '.json', 'Body': JSON.stringify(data) } ).promise() }) )
各Promise処理(重たい処理)でエラーが出たときにCloudWatchでログ出力したい、などという場合は、await-catchしておけばOKです。
const arr = ['aaa', 'bbb', 'ccc', 'ddd'] await Promise.all( arr.map(async data => { await S3.putObject( { 'Bucket': 'saba6seimenjo', 'Key': 'var/db/apps/' + data + '.json', 'Body': JSON.stringify(data) } ).promise() .catch(e => { throw new Error(`不正なデータ「${data}」です`) }) }) )
bluebird.jsのPromise.mapというメソッドもあります。
Promise.map | bluebird
Bluebird is a fully featured JavaScript promises library with unmatched performance.
非PromiseはPromise.resolve()でラップされる
Promise.all([1]);
これはPromise.all([Promise.resolve(1)])と同じです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント