AWS Lambda(node.js)でmapとPromise.allで並列実行する

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.

コメント

タイトルとURLをコピーしました