[英]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.