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

Is it possible to delete files from GCS async

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

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 example 中看到 api 本质上是异步的:

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

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

运行 是否可以通过 api 原生地执行异步命令?

delete object API 调用是同步的(它不是 return 您必须轮询才能知道操作是否完成的 jobId)。因此,标准库无法实现异步调用,因为它是同步的。

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

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

您正在使用的 com.google.cloud.storage API 没有内置此功能。您始终可以 运行 在后台线程中调用或使用 Futures as demonstrated in the answers here .

您还可以使用 S3 的 Java 库访问 Google 云存储,does have a built in async API. Use the migration guide 以同时使用这些库。注意 GCS 不支持 S3 的多对象删除 API 所以你不能使用他们的 deleteObjects 方法。

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