如何查询AWS Glacier归档文件的上传状态
AWS Glacier归档状态查询及恢复方案
首先明确:你遇到的等待并非上传的归档未就绪,而是归档取回(下载)任务本身的处理耗时。Glacier归档上传成功后就处于永久可用状态,不同场景的状态查询方式如下:
1. 上传归档的有效性校验
你使用Java SDK(aws-java-sdk-glacier包)完成上传后,只要收到接口返回的ArchiveId,就代表归档已成功写入Glacier,无需额外查询归档存在状态。
如果需要校验上传内容完整性,可在上传时携带本地计算的SHA-256树哈希,上传完成后和服务端返回的哈希值比对即可,示例代码如下:
UploadArchiveRequest uploadReq = new UploadArchiveRequest() .withVaultName("你的vault名称") .withChecksum("本地预计算的SHA256树哈希") .withBody(fileInputStream) .withContentLength(fileSize); UploadArchiveResult uploadRes = glacierClient.uploadArchive(uploadReq); // 校验上传完整性,确认归档有效 String serverChecksum = uploadRes.getChecksum(); String archiveId = uploadRes.getArchiveId();
多设备上传的场景下,建议你把每个归档对应的ArchiveId、哈希值、所属设备标识、备份时间等元数据存入独立的中心数据库,恢复时直接从数据库取对应ArchiveId即可,无需调用Glacier接口查询归档存在性。
2. 归档取回任务的状态查询
Glacier不同取回层级的默认耗时不同:标准取回3-5小时、加急取回1-5分钟、批量取回5-12小时,这个过程的状态可以通过返回的任务ID查询,示例代码如下:
// 第一步:发起归档取回任务 InitiateJobRequest initJobReq = new InitiateJobRequest() .withVaultName("你的vault名称") .withJobParameters(new JobParameters() .withType("archive-retrieval") .withArchiveId("待恢复的归档ID") .withTier("Standard") // 可选Expedited/Bulk匹配不同取回速度 ); InitiateJobResult initJobRes = glacierClient.initiateJob(initJobReq); String jobId = initJobRes.getJobId(); // 第二步:轮询查询任务状态 DescribeJobResult jobInfo; do { Thread.sleep(60000); // 建议每分钟轮询一次,避免触发限流 jobInfo = glacierClient.describeJob(new DescribeJobRequest() .withVaultName("你的vault名称") .withJobId(jobId)); } while (!jobInfo.isCompleted()); // 任务完成后下载归档内容 if (StatusCode.Succeeded.toString().equals(jobInfo.getStatusCode())) { GetJobOutputResult outputRes = glacierClient.getJobOutput(new GetJobOutputRequest() .withVaultName("你的vault名称") .withJobId(jobId)); InputStream archiveContent = outputRes.getBody(); // 自行处理恢复的归档内容即可 }
适配多设备备份恢复的优化建议
- 可配置SNS通知绑定取回任务,任务完成后主动接收通知,无需主动轮询减少额外接口调用
- 如果对恢复时效要求极高,可选择S3 Glacier Instant Retrieval存储类,支持毫秒级取回归档,无需等待任务处理
内容的提问来源于stack exchange,提问作者Rami Khawaly
相关产品推荐
相关产品推荐

