繁体   English   中英

是否可以从 GCS 异步中删除文件

[英]Is it possible to delete files from GCS async

我正在尝试一次从谷歌云存储中删除许多文件。
我正在使用以下代码:

public List<Boolean> deleteObjects(List<String> fileParams) {
      List<BlobId> blobs =
          fileParams.stream()
              .map(
                  file -> {
                    logger.info("deleteObject: {}", file);
                    return BlobId.of(bucketName, file);
                  })
              .collect(Collectors.toList());
      return storage.delete(blobs);
  }

这个调用需要很长时间——我试图删除 150k 个文件,它花了将近 1 小时。

我想将其作为“发射后忘记”运行。

我在JS 示例中看到 api 本质上是异步的:

await storage.bucket(bucketName).file(fileName).delete();

我没有找到 Java 这样的例子,无论有没有批次。
我想我可以启动一个新线程并运行它,但我想知道 API 本身是否支持类似的东西。

是否可以通过 api 本机运行异步命令?

删除对象API 调用是同步的(它不会返回您必须轮询才能知道操作是否完成的 jobId)。 因此,标准库无法实现异步调用,因为它是同步的。

NodeJS 最佳实践是在执行 API 调用时创建异步函数。 这是一种语言设计,而不是 API 行为。 你可以在 Java、Python 和 Go 中做同样的事情,但它不是开箱即用的,你需要自己创建并发。

Guillaume 的回答在技术上是正确的,因为底层 HTTP API 是同步的,听起来您正在寻找一种在代码中进行异步调用并让调用在后台运行的方法。

您正在使用的com.google.cloud.storage API 没有内置此功能。您始终可以在后台线程中运行调用或使用 Futures ,如此处的答案所示

您还可以使用 S3 的 Java 库访问 Google Cloud Storage,它有一个内置的异步 API 使用迁移指南一起使用这些库。 注意 GCS 不支持 S3 的 Multiple object delete API 所以你不能使用他们的deleteObjects方法。

请注意,因为底层 HTTP API 是同步的,所以当删除调用在后台线程中发生时,您的应用程序无法退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM