如何以异步方式在rust中列出超过1000个aws-s3对象?

时间:2019-12-27 14:26:11

标签: amazon-s3 rust rust-tokio rust-actix actix-web

我有一个aws-s3存储桶,其中包含20000个以上的对象,我想要所有对象的名称。 但是aws会返回1000个批次的对象,并且每次我们需要使用上一个批次以及每个批次中的最后一个对象名称来查询下一个批次时,是否提供一个标记,表明是否剩余任何批次。(FYI aws-s3存储对象的时间顺序)。

我正在使用此库https://rusoto.github.io/,并且该库中的所有aws请求都将返回将来。因此,我无法获得如何将一个将来调用的输出提供给另一个将来的调用,直到某些条件变为假并最终使用累积输出。

我试图使用它们的唯一sync()调用和Future的wait call()来使s3对象列表调用同步。但是我在2个Future之间调用了这个同步功能,我不为什么,但是在此同步调用之后,将来的民意测验就没有发生了,其余代码只是保持静止。所以整个通话就是这样

fn http_handler() -> Box<Future<Error(), Item = ()>> {
    let res = get_export_path_future_call()
        .and_then(|dir: String| {
            let objects = list_all_s3_objects_sync(dir, client);
            Ok(objects)
        })
        .and_then(|objects| write_objects_name_to_queue_future_call().and_then(|_res| Ok(())));
    Box::new(res)
}

但是,使用这种方法,我的同步调用以及此后所有其他所有调用均未运行,可能是因为将来未进行轮询。 这是我的actix http服务器的http请求处理程序之一。 Http服务器创建代码。

fn create_http_server() {
    HttpServer::new(move || {
        HttpApp::new().data(app.clone()).service(
            web::scope(&format!("/api/{}", &cluster_id))
                .data(JsonConfig::default().limit(*JSON_PAYLOAD_LIMIT))
                .route("/hello", web::get().to(index))
                .configure(|cfg| build_common_api::<App>(cfg, replication_guard))
                .configure(custom_http_routes),
        )
    })
    .workers(*HTTP_WORKERS)
    .shutdown_timeout(10)
    .listen(listener)
    .with_context(|| "Error in starting actix web server")?
    .start();
}

有人可以帮我吗?我可以使用异步,非异步方法,但还是更可取。

谢谢。

0 个答案:

没有答案