0
0

More than 3 years have passed since last update.

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

Posted at

前回の追加実験です。
Promise.all()したらどうなるのかやってみました。

実験1

まずは前回の実験3の状態に、環境変数AWS_NODEJS_CONNECTION_REUSE_ENABLED1にセットした状態で、別々のインスタンスでセッションが共有されることを確認します。

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();

結果は同じでした。
(出力は割愛)

まとめ

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0