개요
이 가이드 에서는 Rust 운전자 의 성능을 최적화하는 방법을 학습 수 있습니다. MongoDB 에 연결하려면 Client 인스턴스 만들어야 합니다. Client 인스턴스 는 서버 토폴로지 검색 및 연결 모니터링 과 같은 대부분의 연결 측면을 자동으로 처리합니다. 이 가이드 Client 인스턴스 구성하고 사용하기 위한 권장사항 설명합니다.
이 가이드에는 다음 섹션이 포함되어 있습니다.
클라이언트 수명 주기에서는 인스턴스 만들고 관리하기 위한 권장사항
Client설명합니다.병렬 처리는 병렬 비동기 작업을 실행 위한 샘플 코드를 제공합니다.
런타임에서는 및 크레이트의 기능을 사용하여 런타임을 관리
tokioasync_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) }); 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 인스턴스 만들어 런타임 간에 의도하지 않은 상호 작용이 없도록 합니다.
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 문서
모듈에서spawn()
tokio::tasktokio::runtime module