可以从GCS异步删除文件吗?



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

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本地运行async命令?

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

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

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

您正在使用的com.google.cloud.storageAPI没有内置此功能。你总是可以在后台线程中运行调用,或者像这里的答案一样使用Futures。

您还可以使用S3的Java库访问Google Cloud Storage,该库确实有内置的异步API。使用迁移指南来一起使用这些库。注意GCS不支持S3的多对象删除API,所以你不能使用他们的deleteObjects方法。

注意,因为底层的HTTP API是同步的,当删除调用在后台线程中发生时,你的应用程序不能退出。

最新更新