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 설명합니다.

  • 병렬 처리는 병렬 비동기 작업을 실행 위한 샘플 코드를 제공합니다.

  • 런타임에서는 및 크레이트의 기능을 사용하여 런타임을 관리 tokio async_std 방법을 설명합니다.

  • 추가 정보 에서는 이 가이드 에 언급된 유형 및 메서드에 대한 리소스 및 API 문서 링크를 제공합니다.

연결 풀을 사용하여 성능을 최적화할 수 있습니다. 자세한 학습 은 연결 풀로 연결 관리 가이드 참조하세요.

세션 및 작업 전반에서 클라이언트를 재사용하는 것이 좋습니다. 유형은 여러 스레드에서 동시에 사용하기에 안전하므로 동일한 인스턴스를 사용하여 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_std 크레이트에서 test 헬퍼 매크로를 사용하여 애플리케이션 테스트하는 경우 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 가이드 참조하세요.

연결 풀을 사용하여 성능을 최적화하는 방법을 학습 연결 풀로 연결 관리 가이드 참조하세요.

돌아가기

연결 풀

이 페이지의 내용