Google Cloud での接続の管理
Google Cloud PlatformFunctions Atlasを使用して クラスターを操作できますGoogle Cloud Platform および の実行。
ベストプラクティス
次のベストプラクティスを使用して、 Google Cloud Platform関数とAtlasの間の接続を適切に管理します。
関数スコープのデータベース接続ではなく、グローバルスコープのデータベース接続を使用して Cloud Function を作成します。
関数を呼び出すたびに新しい
MongoClient
オブジェクトを定義しないでください。定義すると、ドライバーは関数を呼び出すごとに新しいデータベース接続を作成します。こうなると、コストが高くなり、アプリケーションがデータベース接続制限を超えてしまう可能性があります。新しいMongoClient
を定義するときは、以下を行う必要があります。MongoClient
オブジェクトを一度だけ作成します。オブジェクトを保存し、関数の呼び出し全体で
MongoClient
を再利用できるようにします。
この接続例では、既存のデータベース接続を再利用して、データベースとの通信を高速化し、データベースへの接続数をアプリケーション トラフィックに関して適切なレベルに維持します。
多数のシャードを含むシャーディングされたクラスターに接続する関数がある場合、パフォーマンスの問題が発生する可能性があります。 たとえば、シャーディングされた Atlas クラスターが 10 個ある場合、ドライバーはデフォルトで 30 個の
mongos
インスタンスすべてに接続します。 接続文字列にsrvMaxHosts
オプションを使用して、ドライバーが接続するホストの最大数を設定できます。 ドライバーのパフォーマンスを向上させるには、srvMaxHosts=3
を設定します。 例:mongodb+srv://<db_username>:<db_password>@<clusterName>.mongodb.net/?retryWrites=true&w=majority&srvMaxHosts=3 詳細については、「接続オプション 」を参照してください。
Atlas クラスターへのネットワーク アクセスを制限します。
クラスターと Atlas関数間の ネットワークピアリング接続 を使用してプライベート ネットワーク経由でAtlasGCP クラスターに接続するか、または IPプライベートエンドポイント を使用して、 アクセスIP リスト からプライベート アドレスのみを許可できるようにします。
プライベートネットワークを使用しない場合は、 NAT ゲートウェイ 経由で Atlas クラスターに接続することを検討してください 。それ以外の場合は、Atlas クラスターへのすべての IP アドレス( 0 . 0 . 0 . 0 / 0 )を許可する必要があります。
警告
0.0.0.0/0
を IP アクセス リストに追加すると、パブリック インターネットのどこからでもクラスターにアクセスできるようになります。どこからでもアクセスを許可する場合は、すべてのデータベース ユーザーについて必ず強力な認証情報を使用してください。
maxIdleTimeMS を
60000
に設定すると、アイドルタイムが 1 分経過した後に接続が自動的に閉じられます。maxIdleTimeMS
を調整すると、サーバーレス関数からのタイムアウト エラーの発生を減らすことができます。
同時実行性を構成します。 新しいGoogle Cloud Platform関数を作成すると、
複数の同時リクエストを処理できる 2nd gen環境を選択します。 また、関数が単一の
MongoClient
を多数の同時呼び出しで共有できるようにすることで、サーバーの接続負荷も軽減します。同時実行設定を増やすと、コールド スタートが最小限に抑えられ、レイテンシが改善されます。
注意
同時実行設定を増やす場合は、最高のパフォーマンスを得るために CPU を増やす必要がある場合があります。 詳細については、「 同時実行性 」を参照してください。
Google Cloud Platform接続例
次の例では、Node.js Google Cloud Platform 関数を Atlas配置に接続します。 <YOUR-ATLAS-CONNECTION-STRING>
を Atlas 接続文字列に置き換えます。
const { MongoClient } = require('mongodb'); let client; async function getConnection() { if (!client) { const client = new MongoClient('<YOUR-ATLAS-CONNECTION-STRING>'); client.on('connectionCreated', () => { console.log('New connection created successfully.'); }); // Connect to the database in the global scope await client.connect(); } return client; }