前回の追加実験です。
Promise.all()
したらどうなるのかやってみました。
実験1
まずは前回の実験3の状態に、環境変数AWS_NODEJS_CONNECTION_REUSE_ENABLED
を1
にセットした状態で、別々のインスタンスでセッションが共有されることを確認します。
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();
以下が出力されました。
#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()
の最後に以下を追加して実行してみます。
(差分のみ記載)
const requests = [cl.describeTable({ TableName }).promise(), cl2.describeTable({ TableName }).promise()];
await Promise.all(requests);
console.log('#6');
printSession();
以下が出力。
#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)
新しいセッションが作られました。
念のため、同じインスタンスだとどうなるのか。
const requests = [cl.describeTable({ TableName }).promise(), cl.describeTable({ TableName }).promise()];
await Promise.all(requests);
console.log('#6');
printSession();
結果は同じでした。
(出力は割愛)
まとめ
同時に処理される場合は、リクエストに必要なだけ(不足する分の)セッションが作られました。
(まあ、当たり前と言えば当たり前か)
高速化を狙って並列化しても、却って遅くなることもあるかも知れないです。
それよりも、(ちゃんと)テーブルやクエリを工夫して、リクエスト数を減らす方がよさそうですね。