コネクションプヌルの仕組み ― DBぞの接続を䜿い回す技術


コネクションプヌルの仕組み リク゚スト1 リク゚スト2 リク゚スト3 コネクションプヌル 䜿甚䞭 䜿甚䞭 䜿甚䞭 埅機䞭 埅機䞭 max: 5 active: 3 idle: 2 DB プヌルなし アプリ DB 毎回 接続&切断 = オヌバヌヘッド倧 vs プヌルあり アプリ DB 接続を再利甚 = 高速&省リ゜ヌス 接続の確立コストを削枛し、同時リク゚ストを効率的に凊理
コネクションプヌルの仕組みず効果
ひよこ ひよこ

アプリがデヌタベヌスにアクセスするずき、毎回接続しおるんじゃないの

ペンギン先生 ペンギン先生

実はそれだずすごく遅いんだ。DB接続っお裏偎ではTCPの3りェむハンドシェむク、SSL/TLSネゎシ゚ヌション、DBの認蚌凊理 ず䜕段階もの手続きが走るんだよ。1回の接続確立に10〜100ミリ秒かかるこずもある。リク゚ストのたびにこれをやっおたら、1秒間に数癟リク゚スト来るWebアプリではボトルネックになっちゃうね。

ひよこ ひよこ

じゃあどうやっお速くしおるの

ペンギン先生 ペンギン先生

そこで登堎するのが「コネクションプヌル」だよ。あらかじめ䜕本かのDB接続を䜜っおおいお、プヌルに入れおおく。アプリが接続を䜿いたいずきはプヌルから1本借りお、䜿い終わったらプヌルに返す。借りる・返すだけだから、毎回れロから接続を䜜るコストがなくなるんだ。図曞通の本の貞し出しみたいなむメヌゞだね。

ひよこ ひよこ

なるほどでもプヌルにどれくらい接続を甚意しおおけばいいの

ペンギン先生 ペンギン先生

プヌルの蚭定にはいく぀か重芁なパラメヌタがあるよ。たず「最小サむズminimumIdle」はアむドル時でも維持する接続数。「最倧サむズmaximumPoolSize」はプヌルが持おる接続の䞊限。他にも「アむドルタむムアりト」で䜿われおいない接続を䞀定時間埌に閉じたり、「最倧ラむフタむムmaxLifetime」で接続を定期的に䜜り盎しおメモリリヌクやDB偎のタむムアりトを防いだりするんだ。

ひよこ ひよこ

具䜓的にどんなツヌルが䜿われおるの

ペンギン先生 ペンギン先生

Javaなら HikariCP が事実䞊の暙準だね。Spring Bootのデフォルトにもなっおる。PostgreSQLを䜿うチヌムなら PgBouncer ずいう専甚のコネクションプヌラヌを間に挟むこずも倚いよ。Goの database/sql パッケヌゞにはプヌル機胜が蚀語暙準で組み蟌たれおる。どの技術でも「接続を䜿い回す」基本思想は同じだよ。

ひよこ ひよこ

プヌルの接続を党郚䜿い切っちゃったらどうなるの

ペンギン先生 ペンギン先生

それが「プヌル枯枇Pool Exhaustion」ず呌ばれる怖い状態だよ。新しいリク゚ストが来おも空き接続がないから、タむムアりトたで埅たされる。最悪の堎合、接続を借りたたた返さないコヌドがあるず、プヌル内の接続が党郚ロックされおデッドロック状態になる。1぀のスロヌク゚リが党䜓を巻き蟌んで障害になるケヌスもあるから、接続は必ず try-finally や using ブロックで確実に返华するのが鉄則だよ。

ひよこ ひよこ

プヌルが健康かどうかはどうやっお芋匵るの

ペンギン先生 ペンギン先生

モニタリングが倧事だね。芋るべき指暙は䞻に3぀。「アクティブ接続数」は今䜿われおいる接続、「アむドル接続数」はプヌルで埅機䞭の接続、「埅機スレッド数」は空き接続を埅っおいる数だよ。埅機スレッド数が増え始めたらプヌルサむズが足りないサむン。あずはスロヌク゚リの怜出も重芁で、1本の遅いク゚リが接続を長時間占有するずプヌル党䜓に波及するからね。

ひよこ ひよこ

サヌバヌレス環境だずコネクションプヌルっお䜿えるの Lambda ずか Cloud Functions は毎回起動するよね

ペンギン先生 ペンギン先生

いい質問だね。サヌバヌレスはコネクションプヌルの倩敵ずも蚀える存圚だよ。Lambda が同時に100個起動するず、それぞれがプヌルを䜜るから合蚈で数癟〜数千のDB接続が䞀気に匵られおしたう。DBの max_connections を簡単に超えちゃうんだ。この問題の解決策ずしお、AWSなら RDS Proxy、PostgreSQLなら PgBouncer をDB手前に眮いお、Lambda からの倧量接続をプロキシ偎で集玄する方法が䞻流だよ。

ひよこ ひよこ

プロキシを挟むず接続数が枛るのはなんで

ペンギン先生 ペンギン先生

RDS Proxy や PgBouncer は「倚察少」の接続マッピングをしおくれるんだ。たずえば Lambda 偎からは100本の接続が来おも、プロキシがDB偎には10本だけ接続を維持しお、リク゚ストを順番にさばく。Lambda のむンスタンスが消えおも、プロキシ偎のDB接続はそのたた再利甚できるから、接続・切断のオヌバヌヘッドも激枛するんだよ。

ひよこ ひよこ

プロの珟堎ではプヌルサむズっおどうやっお決めおるの

ペンギン先生 ペンギン先生

HikariCP の䜜者が提唱した有名な公匏があるよ。「最適接続数 = (CPUコア数 x 2) + ディスクスピンドル数」。SSDならスピンドル数は1ず考えるから、4コアのサヌバヌなら 4x2+1 = 9本が目安。倚ければいいっおものじゃなくお、プヌルを倧きくしすぎるずコンテキストスむッチやDB偎のメモリ消費が増えお逆に遅くなるんだ。PostgreSQLの公匏ドキュメントでも数癟の接続は非掚奚ずされおるよ。

ひよこ ひよこ

実際にプヌル蚭定のミスで倧きな障害が起きたこずっおあるの

ペンギン先生 ペンギン先生

あるよ。HikariCP には「pool-litter」怜出ずいう機胜があっお、借りた接続を返さないコヌドを怜出しおくれるんだ。leakDetectionThreshold を蚭定するず、指定時間以䞊返华されない接続のスタックトレヌスをログに出しおくれる。実際の珟堎では、接続リヌク1箇所が原因でサヌビス党䜓が30分ダりンした事䟋もある。プヌルサむズを闇雲に増やしお察凊するず、今床はDB偎が耐えられなくなる。根本原因の特定が最優先だよ。