ブログblog

RDS Proxyを使った実験

Writer: noda 更新日:2021/02/03

こんにちは、エンジニアの野田です。
今回はAWSのサービス「RDS Proxy」について試してみたので
その結果を書いていきます。

RDS Proxyとは
その名の通りRDSの前に置かれるプロキシです。

使う目的
RDSではインスタンスタイプによって同時接続数が決まっています。
この接続数が埋まっている状態でアクセスが来た場合には接続失敗となります。
この接続失敗を避けるために、RDS Proxyを置きます。
こうすることによりRDS Proxyが同時接続数を超えた分の接続を待ち状態にし、
RDSが接続可能になるとRDSに接続してくれます。

いつ使うか
Lambdaでサーバーレスなシステムを構築するときです。
EC2などからRDSを使うときはいいのですが、問題はLambdaでサーバーレスな構成にしたときです。
Lambdaは性質上アクセスが来た分だけ起動します。
つまり大量アクセスが来てしまうと、その分全部RDSに接続しようとしますが、
ここで同時接続数を超えてしまいます。
なので今まではLambdaとRDSはアンチパターンとされてきました。

実験
実際ちゃんと動くか検証してみました。
方法としてはRDSからSELECTするプログラムをLambdaで書き、
apache JmeterからAPI Gateway経由でこれを叩きます。

条件
RDS:Aurora MySQLを使用、インスタンスタイプはt3.small
デフォルトの同時接続数は45(あくまで目安で実際は違います)
軽い処理だとさばいてしまうので、
10万レコード用意したテーブルからindex貼っていないカラムを指定してSELECTします。

計測ツール:apache Jmeter
100スレッド
10ループ
Ramp-Up 10秒

結果

RDS Proxyを使わない場合
1000リクエスト中
成功:637
失敗:363
成功したリクエストの処理時間は100ミリ秒~1000ミリ秒でした。

RDS Proxyを使った場合
1000リクエスト中
成功:1000
失敗:0
リクエストの処理時間は
同時接続数内のリクエストについてはRDS Proxyを使わない場合と同じ100ミリ秒~1000ミリ秒。
同時接続数を超えて待ちになった分のリクエストは2000ミリ秒前後でした。

まとめ
RDS Proxyを使うことで確かにすべてのリクエストをさばくことが確認できました。
注意点としては同時接続数を超えて待ちになった分のリクエストが2000ミリ秒前後かかることです。
実際にはもっとたくさんソースコードが書かれたプログラムになるのでもう少しかかると思います。
ただ同時接続内だと時間は変わらないので、非ピーク時は大丈夫だと思います。
判断基準としてはピーク時に時間がかかっても大丈夫かどうかだと思いました。
そこをクリアできれば今回のようにLambdaでもRDSを使った構成が実現できると思いました。