폴링 정책 구성

Rust용 Cloud 클라이언트 라이브러리는 장기 실행 작업(LRO)의 진행 상황을 모니터링하는 도우미 함수를 제공합니다. 이러한 도우미는 정책을 사용하여 폴링 빈도를 구성하고, 일시적이고 재시도해도 안전한 폴링 오류와 복구할 수 없는 폴링 오류를 결정합니다.

두 가지 정책이 LRO 폴링 루프의 동작을 제어합니다.

  • 폴링 백오프 정책은 진행 중인 LRO의 상태를 폴링하기 전에 루프가 대기하는 시간을 제어합니다.
  • 폴링 오류 정책은 폴링 오류를 처리하는 방법을 제어합니다. 일부 폴링 오류는 복구할 수 없으며, 이는 작업이 중지되었거나 호출자에게 상태를 확인할 권한이 없음을 나타냅니다. 다른 폴링 오류는 일시적이며 일시적인 네트워크 또는 서비스 문제를 나타냅니다.

클라이언트에서 시작된 모든 LRO 또는 개별 요청에 대해 각 정책을 독립적으로 설정할 수 있습니다.

시작하기 전에

이 문서에서는 Cloud Storage를 사용하여 폴링 정책 구성을 보여주지만 LRO를 사용하는 모든 Google Cloud 서비스에 동일한 개념이 적용됩니다.

이 문서의 코드를 실행하기 전에 다음 기본 요건을 완료하세요.

  • Rust 시작하기에 따라 개발 환경을 설정합니다.
  • Rust에서 Cloud Storage 사용에 따라 결제가 사용 설정된 Google Cloud 프로젝트를 설정하고 Cloud Storage API를 사용 설정하고 사용자 인증 정보를 구성합니다.
  • 계층적 네임스페이스가 사용 설정된 Cloud Storage 버킷을 만들고, 이름을 바꿀 소스 폴더를 만들고, 주 구성원에게 스토리지 관리자(roles/storage.admin)와 같은 폴더 관리 권한이 있는 Identity and Access Management(IAM) 역할을 부여합니다.

종속 항목

Cargo.toml 파일에 필요한 크레이트를 추가합니다.

cargo add google-cloud-storage google-cloud-lro google-cloud-gax anyhow

클라이언트의 모든 요청에 대한 폴링 빈도 구성

클라이언트의 대부분의 요청에서 동일한 폴링 백오프 정책을 사용하는 경우 클라이언트 빌더에서 정책을 구성합니다. 다음 예시에서는 StorageControl 클라이언트에서 시작한 모든 LRO에 대해 지수 폴링 백오프를 구성합니다.

pub async fn client_backoff(bucket: &str, folder: &str, dest: &str) -> Result<()> {
    use google_cloud_gax::exponential_backoff::ExponentialBackoffBuilder;
    use google_cloud_lro::Poller;
    use std::time::Duration;

    let client = StorageControl::builder()
        .with_polling_backoff_policy(
            ExponentialBackoffBuilder::new()
                .with_initial_delay(Duration::from_millis(250))
                .with_maximum_delay(Duration::from_secs(10))
                .build()?,
        )
        .build()
        .await?;

    let response = client
        .rename_folder()
        .set_name(format!("projects/_/buckets/{bucket}/folders/{folder}"))
        .set_destination_folder_id(dest)
        .poller()
        .until_done()
        .await?;

    println!("LRO completed, response={response:?}");

    Ok(())
}

개별 요청에서 정책을 재정의하지 않는 한 이 구성은 클라이언트에서 시작하는 모든 LRO에 적용됩니다. 이 예시에서 클라이언트 라이브러리는 첫 번째 폴링 후 250ms, 두 번째 폴링 후 500ms를 기다립니다. 그런 다음 지연 시간은 1초, 2초, 4초, 8초로 두 배씩 증가하다가 이후 모든 폴링에 대해 10초로 제한됩니다.

특정 요청의 폴링 빈도 구성

개별 요청 빌더에서 폴링 빈도를 구성할 수도 있으며, 이는 클라이언트 수준 폴링 백오프 정책을 재정의합니다. RequestOptionsBuilder를 범위로 가져오고 요청 빌더에서 with_polling_backoff_policy를 호출합니다.

pub async fn rpc_backoff(bucket: &str, folder: &str, dest: &str) -> Result<()> {
    use google_cloud_gax::exponential_backoff::ExponentialBackoffBuilder;
    use std::time::Duration;
    use google_cloud_gax::options::RequestOptionsBuilder;
    use google_cloud_lro::Poller;

    let client = StorageControl::builder().build().await?;

    let response = client
        .rename_folder()
        .with_polling_backoff_policy(
            ExponentialBackoffBuilder::new()
                .with_initial_delay(Duration::from_millis(250))
                .with_maximum_delay(Duration::from_secs(10))
                .build()?,
        )
        .set_name(format!("projects/_/buckets/{bucket}/folders/{folder}"))
        .set_destination_folder_id(dest)
        .poller()
        .until_done()
        .await?;

    println!("LRO completed, response={response:?}");

    Ok(())
}

클라이언트의 모든 요청에 대한 폴링 오류 정책 구성

루프가 재시도하는 폴링 오류와 폴링이 중지되는 시점을 제어하려면 PollingErrorPolicy 특성을 구현하는 유형(예: Aip194Strict)을 전달합니다.

폴링 오류 정책은 LRO 대기 루프 중에만 오류를 제어합니다. LRO를 시작하는 초기 요청을 전송할 때 일시적인 오류를 처리하려면 클라이언트에서 표준 재시도 정책도 구성합니다.

pub async fn client_errors(bucket: &str, folder: &str, dest: &str) -> Result<()> {
    use google_cloud_gax::polling_error_policy::Aip194Strict;
    use google_cloud_gax::polling_error_policy::PollingErrorPolicyExt;
    use google_cloud_gax::retry_policy;
    use google_cloud_gax::retry_policy::RetryPolicyExt;
    use std::time::Duration;
    use google_cloud_lro::Poller;

    let builder = StorageControl::builder().with_polling_error_policy(
        Aip194Strict
            .with_attempt_limit(100)
            .with_time_limit(Duration::from_secs(300)),
    );

    let client = builder
        .with_retry_policy(
            retry_policy::Aip194Strict
                .with_attempt_limit(100)
                .with_time_limit(Duration::from_secs(300)),
        )
        .build()
        .await?;

    let response = client
        .rename_folder()
        .set_name(format!("projects/_/buckets/{bucket}/folders/{folder}"))
        .set_destination_folder_id(dest)
        .poller()
        .until_done()
        .await?;

    println!("LRO completed, response={response:?}");

    Ok(())
}

특정 요청에 대한 폴링 오류 정책 구성

단일 요청에 대한 폴링 오류 정책을 재정의하려면 RequestOptionsBuilder를 범위로 가져오고 요청 빌더에서 with_polling_error_policy를 호출합니다.

pub async fn rpc_errors(bucket: &str, folder: &str, dest: &str) -> Result<()> {
    use google_cloud_gax::polling_error_policy::Aip194Strict;
    use google_cloud_gax::polling_error_policy::PollingErrorPolicyExt;
    use google_cloud_gax::retry_policy;
    use google_cloud_gax::retry_policy::RetryPolicyExt;
    use std::time::Duration;
    use google_cloud_gax::options::RequestOptionsBuilder;
    use google_cloud_lro::Poller;

    let client = StorageControl::builder()
        .with_retry_policy(
            retry_policy::Aip194Strict
                .with_attempt_limit(100)
                .with_time_limit(Duration::from_secs(300)),
        )
        .build()
        .await?;

    let response = client
        .rename_folder()
        .with_polling_error_policy(
            Aip194Strict
                .with_attempt_limit(100)
                .with_time_limit(Duration::from_secs(300)),
        )
        .set_name(format!("projects/_/buckets/{bucket}/folders/{folder}"))
        .set_destination_folder_id(dest)
        .poller()
        .until_done()
        .await?;

    println!("LRO completed, response={response:?}");

    Ok(())
}