DynamoDBクライアントでセッション再利用されるのか実験してみた　その２

[前回](https://qiita.com/sakai-y/items/7d34c7c211f7a0fc99d4)の追加実験です。
`Promise.all()`したらどうなるのかやってみました。

# 実験1
まずは[前回の実験3](https://qiita.com/sakai-y/items/7d34c7c211f7a0fc99d4#%E5%AE%9F%E9%A8%93%EF%BC%93)の状態に、環境変数`AWS_NODEJS_CONNECTION_REUSE_ENABLED`を`1`にセットした状態で、別々のインスタンスでセッションが共有されることを確認します。

```javascript
import { DynamoDB } from 'aws-sdk';
import { execSync } from 'child_process';

process.env.AWS_REGION = 'ap-northeast-1';
process.env.AWS_NODEJS_CONNECTION_REUSE_ENABLED = '1';

const TableName = 'test-table';

function getDynamoDB() {
  return new DynamoDB({
    endpoint: 'http://localhost:18005',
  });
}

function printSession() {
  try {
    const stdout = execSync('lsof -i@localhost | grep node');
    console.log(stdout.toString());
  } catch (e) {
    console.error('null');
  }
}

async function main() {
  console.log('#0');
  printSession();
  const cl = getDynamoDB();
  console.log('#1');
  printSession();
  await cl.describeTable({ TableName }).promise();
  console.log('#2');
  printSession();
  await cl.describeTable({ TableName }).promise();
  console.log('#3');
  printSession();
  const cl2 = getDynamoDB();
  console.log('#4');
  printSession();
  await cl2.describeTable({ TableName }).promise();
  console.log('#5');
  printSession();
}

main();
```

以下が出力されました。

```shell
#0
null
#1
null
#2
node      6070 user   29u  IPv4 0xa83d103bf35ef62d      0t0  TCP localhost:51201->localhost:18005 (ESTABLISHED)

#3
node      6070 user   29u  IPv4 0xa83d103bf35ef62d      0t0  TCP localhost:51201->localhost:18005 (ESTABLISHED)

#4
node      6070 user   29u  IPv4 0xa83d103bf35ef62d      0t0  TCP localhost:51201->localhost:18005 (ESTABLISHED)

#5
node      6070 user   29u  IPv4 0xa83d103bf35ef62d      0t0  TCP localhost:51201->localhost:18005 (ESTABLISHED)
```

インスタンスが違っても共有されてますね。

# 実験2
`main()`の最後に以下を追加して実行してみます。
（差分のみ記載）

```javascript
  const requests = [cl.describeTable({ TableName }).promise(), cl2.describeTable({ TableName }).promise()];
  await Promise.all(requests);
  console.log('#6');
  printSession();
```

以下が出力。

```shell
#0
null
#1
null
#2
node      6584 user   29u  IPv4 0xa83d103c049d8c4d      0t0  TCP localhost:51367->localhost:18005 (ESTABLISHED)

#3
node      6584 user   29u  IPv4 0xa83d103c049d8c4d      0t0  TCP localhost:51367->localhost:18005 (ESTABLISHED)

#4
node      6584 user   29u  IPv4 0xa83d103c049d8c4d      0t0  TCP localhost:51367->localhost:18005 (ESTABLISHED)

#5
node      6584 user   29u  IPv4 0xa83d103c049d8c4d      0t0  TCP localhost:51367->localhost:18005 (ESTABLISHED)

#6
node      6584 user   29u  IPv4 0xa83d103c049d8c4d      0t0  TCP localhost:51367->localhost:18005 (ESTABLISHED)
node      6584 user   30u  IPv4 0xa83d103bf0bcd62d      0t0  TCP localhost:51368->localhost:18005 (ESTABLISHED)
```

新しいセッションが作られました。

念のため、同じインスタンスだとどうなるのか。

```javascript
  const requests = [cl.describeTable({ TableName }).promise(), cl.describeTable({ TableName }).promise()];
  await Promise.all(requests);
  console.log('#6');
  printSession();
```

結果は同じでした。
（出力は割愛）

# まとめ
同時に処理される場合は、リクエストに必要なだけ（不足する分の）セッションが作られました。
（まあ、当たり前と言えば当たり前か）

高速化を狙って並列化しても、却って遅くなることもあるかも知れないです。

それよりも、（ちゃんと）テーブルやクエリを工夫して、リクエスト数を減らす方がよさそうですね。