コネクションプーリングは、データドリブンなアプリケーションが障害なく大量の負荷を処理できるようにするために非常に重要です。このブログでは、Accelerateによるコネクションプーリングが、ブラックフライデーのピークトラフィック時にサーバーレス環境にデプロイされたオンラインeコマースプラットフォームをどのように救えるかを探ります。
あなたの会社、Mega Electronicsが、電子機器を販売するNext.jsとPrisma ORM、PostgreSQLを使用して構築されたeコマースアプリを持っていると想像してください。Mega Electronicsは、従来のサーバーにデプロイされており、世界中から安定したトラフィックを受けています。
販売シーズンが近づくにつれて、あなたのチームは製品需要の増加によるトラフィックの急増を予測しています。対策として、チームはバックエンドサーバーのストレージを100GB、RAMを4GB増強しました。しかし、サーバーリソースを手動で増やすこのプロセスは、時間がかかり、面倒であることがわかりました。業務効率化のため、インフラが需要に応じて自動的にスケールできれば、より効率的であるとチームは判断しました。
サーバーレスとエッジへの移行
サーバーレス環境は、リアルタイムの需要に基づいてサーバーをスケールするための最適なソリューションを提供します。トラフィックが少ない期間は動的にスケールダウンし、ピーク時にはスケールアップすることでコストを最適化します。ただし、各サーバーレス関数はAPIリクエストごとに個別のデータベース接続を開始するため、このブログで後述する問題につながる可能性があります。
アプリが自動的にスケーリングニーズを満たすようにするために、チームはアプリをサーバーレス環境に移行することを決定しました。世界中のユーザーのページロード時間をさらに短縮するために、チームは一部のAPIにエッジランタイムを使用することにしました。これにより、データがユーザーの場所に最も近いサーバーから提供されるようになります。Prisma ORMとNext.jsはエッジランタイムをサポートしているため、一部のAPIの移行は簡単です。
しかし、週末や小規模なセールシーズンなど、トラフィックが増加すると、チームはデータベースから「申し訳ありません!クライアントが多すぎます。」というエラーメッセージが表示され始めました。
このエラーは、各サーバーレス関数がデータベースへの新しい接続を生成し、データベースの接続制限を圧倒するために、データベースが過負荷になっているために発生します。この問題に対処するために、チームはより多くの接続を処理できるようにデータベースをアップグレードし、より高い負荷の下でのパフォーマンス向上を期待しました。チームは、頻繁なアップデートがより多くの費用とリソースを費やすことに気づきました。ありがたいことに、アップグレードは効果的であり、より多くの接続を受け入れることができる大規模なインスタンスは、増加した接続の流入を管理できるようになりました。
ブラックフライデーの未曽有のトラフィック
ブラックフライデーです。Mega Electronicsに大勢の買い物客が押し寄せます。ホリデーシーズンが始まったばかりのとき、災害が発生しました。Mega Electronicsがダウンしたのです。
原因は何でしょうか?データベース接続プールが再び過負荷になったのです。データベースをアップグレードしたにもかかわらず、「申し訳ありません!クライアントが多すぎます」というエラーメッセージが再び表示されます。特にエッジランタイムを使用しているAPIエンドポイントからです。データベース接続プールは、これらのルートから再び過負荷になりました。データベース接続がまったく再利用されず、トラフィックが予想よりも大幅に多かったためです。チームは、データベースを再度アップグレードしてより多くの接続を処理できるようにすることは非常にコストがかかり、現実的な解決策ではないと判断しました。このイベントの後遺症は、顧客の不満と潜在的な売上の損失につながりました。
ダウンタイム中に10,000件のリクエストが失敗したと想像してください。各リクエストが平均2ドルを費やす可能性のある潜在的な顧客を表すと仮定すると、総損失売上は10,000リクエスト×各2ドルで、20,000ドルになります。
なぜデータベースがサーバーレスまたはエッジでボトルネックになるのか
サーバーレスおよびエッジアプリは通常、状態を持たず、大規模にスケールできます。一方、データベース接続はステートフルであり、再利用が必要であり、一般的にスケーラビリティが限られています。
新しい関数が呼び出されると、データベースへの接続が作成されます。データベースが持つことができる接続数には限りがあり、接続のセットアップまたはクローズは通常、時間的に非常にコストがかかります。したがって、チームがデータベースインスタンスをアップグレードしてより多くの接続を受け入れるようにしても、パフォーマンスは大幅には向上しません。チームは最終的に問題の根本を解決することを決定し、外部接続プーラーを導入することにしました。
コネクションプーリングの力
コネクションプールは、サーバーレスおよびエッジアプリでデータベース接続を効率的に再利用および管理するために不可欠です。データベース接続が簡単に枯渇するのを防ぎ、頻繁なデータベースアップグレードのコストを節約できます。
チームは、外部接続プーラーをスタックに導入するための3つのオプションを検討しています。
- 接続を管理するためのスタンドアロンサーバーの実装:このアプローチは、チームにとってより多くの課題をもたらします。独自の接続プーリングインフラストラクチャを管理すると、メンテナンスと開発運用で高いオーバーヘッドが発生します。
- PgBouncerのような人気のある信頼性の高いオープンソースオプションの使用:堅牢ですが、このソリューションでは、チームがデプロイおよび保守する必要があり、運用および管理のオーバーヘッドが高くなります。
- マネージドコネクションプーリングソリューションであるPrisma Accelerateの使用:チームがすでにPrisma ORMを使用していることを考えると、このオプションはセットアップにシームレスに統合されます。追加のトレーニングを不要にし、メンテナンスと運用オーバーヘッドを削減することで、プロセスを簡素化します。
チームは、Prisma Accelerateが最小限のメンテナンスでコネクションプーリングの問題に取り組むための最良のソリューションであると考えています。ピークトラフィック時にデータベース接続を堅牢にスケールし、スムーズな運用を保証します。
Accelerate — 動作するコネクションプール
Prisma Accelerateは、16のリージョンにまたがるコネクションプーラーと、オプトインのグローバルキャッシュを提供します。データベース接続が簡単に枯渇しないようにし、アプリが高負荷時でもスムーズに動作するようにします。Prisma Accelerateをプロジェクトに追加するには、はじめにガイドに従い、必要な依存関係をすべてインストールしてください。次に、Prisma Accelerateを使用したコネクションプーリングをPrisma ORMプロジェクトに追加すると、次のようになります。
以下のビデオを見ることで、Prisma Accelerateが高負荷時のサーバーレス関数のパフォーマンスを向上させる様子も確認できます。
ボーナス:Accelerateでクエリをキャッシュする
コネクションプーリングに加えて、Prisma Accelerateのグローバルキャッシュは、サーバーレスおよびエッジアプリのパフォーマンスを大幅に向上させます。Prisma Accelerateでクエリ結果をキャッシュすると、ユーザーに近いデータセンターのエッジに結果が保存されます。これにより、データが約5〜10ミリ秒未満でユーザーに配信され、アプリの応答性が向上します。キャッシュがどのように有益であるかの詳細については、キャッシュに関するブログをお読みください。
主なポイント
Mega Electronicsの物語では、教訓は明確です。コネクションプーリングは、ピークトラフィックの急増を処理し、サーバーレスおよびエッジアプリをスケールするために不可欠です。Prisma Accelerateはこれを容易にし、アプリが過酷なトラフィックに直面しても高速かつ信頼性を維持できるようにします。
Prisma Accelerateは、絶え間ない手動介入の必要性を減らし、チームがイノベーションとビジネスの成長に集中するための貴重な時間を解放します。信頼性の向上と優れたDXにより、Prisma Accelerateの採用は単なる技術的なアップグレードではなく、オンラインビジネスの成功への戦略的投資です。これは、ビジネスのダウンタイムのインスタンスが減少し、顧客満足度と潜在的な売上を維持することを意味します。
今すぐPrisma Accelerateを始めましょう
次回の投稿もお見逃しなく!
Prismaニュースレターに登録する