Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

パフォーマンスに関する考慮事項

このガイドでは、 Rustドライバーのパフォーマンスを最適化する方法を学習できます。 MongoDBに接続するには、Clientインスタンスを作成する必要があります。 Clientインスタンスは、サーバートポロジーの検出や接続のモニタリングなど、接続のほとんどの要素を自動的に処理します。このガイドでは、Clientインスタンスの構成と使用に関するベストプラクティスについて説明します。

このガイドには、次のセクションが含まれています。

  • クライアント ライフサイクルでは、Client インスタンスの作成と管理に関するベストプラクティスについて説明します。

  • 並列処理では、非同期タスクを並列に実行中ためのサンプルコードが提供されます。

  • Runtime では、tokio 作成とasync_std 作成の機能を使用してランタイムを管理する方法について説明します。

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します。

Tip

接続プール を使用することでパフォーマンスを最適化できます。詳しくは、 接続プールを使用した接続の管理 のガイドをご覧ください。

クライアントは複数のセッションやオペレーションで再利用することをお勧めします。 同じClientインスタンスを使用して複数のタスクを実行できます。 Client型は複数のスレッドで安全に同時使用できます。 リクエストごとに新しいClientインスタンスを作成すると、パフォーマンスが低下します。

次のコードでは、既存のClientインスタンスへのポインターを受け入れるメソッドが作成されます。これにより、同じクライアントを使用して多くのリクエストを実行できます。

// ... Create a client earlier in your code
async fn make_request(client: &Client) -> Result<(), Box<dyn Error>> {
// Use the client to perform operations
Ok(())
}

非同期の同時実行タスクを実行中並列データ操作を実行することで、パフォーマンスを最適化できます。次の例では、tokio::task モジュールの spawn() メソッドを使用して、挿入操作を実行するための個別の同時実行タスクを作成します。

let client = Client::with_uri_str("<connection string>").await?;
let data = doc! { "title": "1984", "author": "George Orwell" };
for i in 0..5 {
let client_ref = client.clone();
let data_ref = data.clone();
task::spawn(async move {
let collection = client_ref
.database("items")
.collection::<Document>(&format!("coll{}", i));
collection.insert_one(data_ref).await
});
}

Clientインスタンスは、それを作成したtokioまたはasync-stdランタイムのインスタンスにバインドされます。 Clientインスタンスを使用して別のランタイムで操作を実行すると、予期しない動作や失敗が発生する可能性があります。

tokio または async_stdtestヘルパーcrateを使用してアプリケーションをテストすると、Clientインスタンスに期待されるものとは異なるランタイムで操作が意図せず実行される可能性があります。これは、これらのヘルパーマイクロがテストごとに新しいランタイムを作成するために発生します。この問題を回避するには、次のいずれかの戦略を使用できます。

  • testヘルパー マイクロを使用せずに、ランタイムをClientインスタンスにアタッチします。

  • asyncテストごとに新しいClientインスタンスを作成します。

次の例では、テスト用にグローバル ランタイムを Clientインスタンスにアタッチします。 test_list_dbs() メソッドは、このランタイムに接続するクライアントを使用して、配置内のデータベースを一覧表示します。

use tokio::runtime::Runtime;
use once_cell::sync::Lazy;
static CLIENT_RUNTIME: Lazy<(Client, Runtime)> = Lazy::new(|| {
let rt = Runtime::new().unwrap();
let client = rt.block_on(async {
Client::with_uri_str("<connection string>").await.unwrap()
});
(client, rt)
});
#[test]
fn test_list_dbs() -> Result<(), Box<dyn Error>> {
let (client, rt) = &*CLIENT_RUNTIME;
rt.block_on(async {
client.list_database_names().await
})?;
Ok(())
}

次の例では、 tokio::test を使用して実行されるテストごとに新しい Clientインスタンスを作成し、ランタイム間で意図しないインタラクションが存在しないようにします。

#[tokio::test]
async fn test_list_dbs() -> Result<(), Box<dyn Error>> {
let client = Client::with_uri_str("<connection string>").await?;
client.list_database_names().await?;
Ok(())
}

MongoDBへの接続の詳細については、「 MongoDBクライアントの作成 」ガイドを参照してください。

Rustドライバーで利用可能なランタイムの詳細については、「 非同期 API と同期 API のガイド 」を参照してください。

接続プールを使用してパフォーマンスを最適化する方法については、「 接続プールによる接続の管理 」ガイドを参照してください。

戻る

接続プール

項目一覧