Rust谷歌云长操作(LRO)管理库google-cloud-lro的使用,支持异步任务跟踪与状态管理

Rust谷歌云长操作(LRO)管理库google-cloud-lro的使用,支持异步任务跟踪与状态管理

安装

在项目目录中运行以下Cargo命令:

cargo add google-cloud-lro

或者在Cargo.toml中添加以下行:

google-cloud-lro = "0.3.3"

使用示例

以下是一个完整的示例demo,展示如何使用google-cloud-lro库来管理谷歌云的长期运行操作(LRO):

use google_cloud_lro::{
    client::LongRunningOperationClient,
    operation::{Operation, OperationState},
};
use google_cloud_googleapis::Status;
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    // 创建LRO客户端
    let client = LongRunningOperationClient::default();

    // 模拟一个长期运行的操作
    let operation_id = "test-operation-123".to_string();
    let mut operation = Operation {
        name: operation_id.clone(),
        done: false,
        result: None,
        error: None,
        metadata: None,
    };

    // 将操作提交到服务器
    client.create_operation(&operation).await.unwrap();

    // 模拟操作进行中
    println!("Operation {} is running...", operation_id);
    sleep(Duration::from_secs(2)).await;

    // 更新操作状态为完成
    operation.done = true;
    operation.result = Some(OperationState::Response(Status {
        code: 0, // OK
        message: "Operation completed successfully".to_string(),
        details: vec![],
    }));

    // 更新服务器上的操作状态
    client.update_operation(&operation).await.unwrap();

    // 检查操作状态
    let updated_operation = client.get_operation(&operation_id).await.unwrap();
    println!("Operation status: {:?}", updated_operation);

    // 删除完成的操作
    client.delete_operation(&operation_id).await.unwrap();
    println!("Operation {} deleted", operation_id);
}

功能说明

  1. 创建操作:使用create_operation方法创建新的长期运行操作
  2. 更新操作:使用update_operation方法更新操作状态
  3. 获取操作状态:使用get_operation方法检查操作当前状态
  4. 删除操作:使用delete_operation方法删除已完成的操作

操作状态

Operation结构体包含以下重要字段:

  • name: 操作唯一标识符
  • done: 表示操作是否完成
  • result: 操作结果(成功或失败)
  • error: 如果操作失败,包含错误信息
  • metadata: 操作元数据

注意事项

  1. 此库需要配合其他谷歌云服务库使用
  2. 长期运行操作通常用于异步API调用,如创建云资源等
  3. 操作状态需要定期轮询或使用回调机制检查

更多详细文档请参考官方文档。


1 回复

Rust谷歌云长操作(LRO)管理库google-cloud-lro使用指南

概述

google-cloud-lro是一个Rust库,用于管理Google Cloud的长运行操作(Long-Running Operations, LRO)。它提供了异步任务跟踪和状态管理的功能,简化了与Google Cloud服务的交互,特别是那些需要长时间运行的操作。

主要特性

  • 支持异步/等待模式
  • 自动轮询操作状态
  • 提供操作结果获取
  • 支持错误处理
  • 可配置的轮询间隔和超时

安装

在Cargo.toml中添加依赖:

[dependencies]
google-cloud-lro = "0.1"
tokio = { version = "1.0", features = ["full"] }

完整示例代码

以下是内容中提供的完整示例,展示了如何使用google-cloud-lro管理长运行操作:

use google_cloud_lro::{Client, Operation};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化客户端
    let client = Client::builder()
        .poll_interval(Duration::from_secs(5)) // 设置轮询间隔为5秒
        .build()
        .await?;

    // 启动长运行操作
    let operation = client
        .start_operation("projects/my-project/locations/us-central1/operations")
        .await?;

    println!("Operation started: {}", operation.name());

    // 等待操作完成
    let result = operation.wait().await?;
    
    match result {
        Some(response) => println!("Operation succeeded: {:?}", response),
        None => println!("Operation completed but no response data"),
    }

    Ok(())
}

扩展完整示例

基于内容中的示例,下面是一个更完整的示例,包含高级功能和错误处理:

use google_cloud_lro::{Client, Operation};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化带有自定义配置的客户端
    let client = Client::builder()
        .poll_interval(Duration::from_secs(10)) // 每10秒轮询一次
        .timeout(Duration::from_secs(300))     // 5分钟后超时
        .build()
        .await?;

    // 启动长运行操作
    let operation = client
        .start_operation("projects/my-project/locations/us-central1/operations")
        .await?;

    println!("Operation started: {}", operation.name());

    // 获取操作元数据
    let metadata = operation.metadata().await?;
    println!("Initial operation metadata: {:?}", metadata);

    // 处理操作结果
    match operation.wait().await {
        Ok(result) => match result {
            Some(response) => {
                println!("Operation completed successfully: {:?}", response);
                // 处理响应数据...
            }
            None => println!("Operation completed but no response data"),
        },
        Err(e) if e.is_timeout() => {
            eprintln!("Operation timed out after 5 minutes");
            // 尝试取消操作
            if let Err(cancel_err) = operation.cancel().await {
                eprintln!("Failed to cancel operation: {}", cancel_err);
            }
        }
        Err(e) if e.is_cancelled() => {
            eprintln!("Operation was cancelled by user or system");
        }
        Err(e) => {
            eprintln!("Operation failed: {}", e);
            // 错误处理逻辑...
        }
    }

    Ok(())
}

注意事项

  1. 确保已正确设置Google Cloud认证环境变量
  2. 长运行操作可能会产生费用,注意监控资源使用情况
  3. 根据操作类型不同,完成时间可能有很大差异
  4. 适当设置轮询间隔以避免过多API调用
  5. 考虑实现重试逻辑处理临时性失败
  6. 在生产环境中添加适当的日志记录
回到顶部