如何缩短Amazon S3响应时间?问题排查及解决记录
获取S3存储桶最新文件响应过慢问题排查与解决
问题描述
我有一个Java方法,通过列出Amazon S3存储桶中的所有对象并按名称(所有文件名均包含时间戳)排序来获取最新保存的文件。问题在于响应时长可达13秒甚至20秒,具体取决于存储桶中的对象数量。
我猜测问题出在调用路径上:客户端→Cloudflare→负载均衡器→Ingress控制器→我的服务容器→Ingress控制器→负载均衡器→Cloudflare→客户端,因为在本地调用该方法时,平均响应时长仅为1.5毫秒。
有没有办法缩短响应时间?
相关代码
服务方法
public URL getLastSavedFile(Integer vehicleId) { try { S3ObjectSummary s3ObjectSummary = repository.downloadLastFile(String.valueOf(vehicleId)); GeneratePresignedUrlRequest request = getPresignedUrl(s3ObjectSummary); log.info("Returned URL of last file from S3 storage, for vehicle - {}", vehicleId); return s3Client.generatePresignedUrl(request); } catch (IndexOutOfBoundsException e) { log.info("Failed to get last snapshot, the following - {} doesn't exist in storage", vehicleId); throw new RuntimeException(e); } }
仓库代码
public S3ObjectSummary downloadLastFile(String vehicleId) { ObjectListing listing = s3client.listObjects( env.getProperty("INIT_S3_BUCKET"), vehicleId ); List<S3ObjectSummary> objects = listing.getObjectSummaries(); while (listing.isTruncated()) { listing = s3client.listNextBatchOfObjects (listing); objects.addAll (listing.getObjectSummaries()); } objects.sort((o1, o2) -> o2.getKey().compareTo(o1.getKey())); return objects.get(0); //sorted list with most recent timestamp in the beginning }
问题解决
已解决!经排查,问题根源在于Maven依赖,原本使用的是aws-java-sdk 1.12.382旧版本,将其替换为aws-java-sdk-s3 1.12.415版本后,问题得到解决,现在响应时长为1-2秒。
内容的提问来源于stack exchange,提问作者VegetaSan
相关产品推荐
相关产品推荐

