是否可通过GCS原生API异步删除Google Cloud Storage文件?
关于Google Cloud Storage Java客户端原生异步删除能力的说明
结论
Google Cloud Storage 官方Java客户端原生支持异步删除能力,不需要自行维护线程池实现异步逻辑。
性能慢的原因排查
你当前使用的同步Storage.delete()方法执行缓慢是因为GCS公开API单次批量删除请求最多支持处理100个对象,传入15万个对象时,客户端底层会自动将列表拆分为每批100个的请求串行执行,叠加网络往返开销,自然会出现耗时极长的问题。
原生异步删除实现方案
你可以使用官方提供的AsyncStorage异步客户端实现即发即弃的删除效果,示例代码如下:
import com.google.cloud.storage.AsyncStorage; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.StorageOptions; import com.google.common.collect.Lists; import java.util.List; import java.util.stream.Collectors; // 初始化异步客户端,全局单例即可 private final AsyncStorage asyncStorage = StorageOptions.getDefaultInstance().getAsyncService(); private final String bucketName = "你的存储桶名称"; public void deleteObjectsAsync(List<String> fileParams) { // 按GCS API单次批量删除的100个对象上限拆分请求 List<List<BlobId>> deleteBatches = Lists.partition( fileParams.stream() .peek(file -> logger.info("提交删除请求:{}", file)) .map(file -> BlobId.of(bucketName, file)) .collect(Collectors.toList()), 100 ); // 批量提交异步删除请求,不等待返回结果,实现即发即弃 deleteBatches.forEach(asyncStorage::delete); }
注:示例中
Lists.partition为Guava工具类方法,如果你项目中没有引入Guava,自行实现列表分片逻辑即可。
如果不需要关心删除的最终结果,该实现已经完全满足即发即弃的需求,所有请求处理逻辑由客户端内置的线程池异步执行,不会阻塞当前业务线程。
更优的大量文件删除方案
如果你要删除的文件有统一的前缀、后缀或者其他可匹配的规则,更推荐直接配置GCS存储桶的生命周期管理规则,由GCS后端自动执行删除操作,不需要占用你的服务资源,处理速度也远高于主动调用API删除。
内容的提问来源于stack exchange,提问作者oshai
相关产品推荐
相关产品推荐

