AWS s3上传+ api耗时太长

时间:2017-01-28 05:57:00

标签: ios swift amazon-web-services amazon-s3

目前,我使用亚马逊s3存储所有对象,如图片和视频。我使用IOS AWS SDK上传对象。

我的申请流程

  1. 用户拍摄照片或录制视频
  2. 用户在表单上添加其他信息,例如 Instagram的标题(使用Alamofire)
  3. 用户点击继续,然后AWS将开始上传图片 和使用IOS AWS SDK
  4. 的视频
  5. 对象成功上传到S3后,S3将响应 有链接
  6. 最后使用Alamofire发送包含链接的信息 S3作为POST API的参数
  7. 我面临的问题是,AWS上传+调用API需要花费很多时间。这确实是一个糟糕的用户体验。大多数图像大致小于5 MB

    我的解决方案

    1. 调整图片大小,但视频呢?

    2. 用户点击“继续”后,而不是执行AWS上传+调用 API,为什么不把它作为不同屏幕上的背景,这样做 用户不需要等待加载指示符

    3. 解决这个问题的方法是什么?感谢

5 个答案:

答案 0 :(得分:1)

您的问题可以改为问题"如何最大程度地减少上传延迟?"

最重要的是将AWS用于所有应用基础架构。

如果您使用S3作为文件存储并从外部服务器上传,则由于网络延迟,您将面临对上传速度的巨大影响。

  • 当用户上传时,您的后端进程将首先写入磁盘 - 使用EBS SSD。
  • 选择EC2,增加网络延迟。
  • 将您的所有AWS资源放在同一区域和相同的可用性中 区。

您可能需要考虑的另一个解决方案是使用S3后操作,而不是在操作中。

这只是意味着您的服务器接受上传并将URL返回给用户,其中独立后台进程与用户请求之外的S3同步。

在这种情况下,您将拥有 User - >服务器 - >用户

现在你有用户 - >服务器 - > S3 - >用户

答案 1 :(得分:0)

当速度和用户体验至关重要时,您可能希望使用AWS cloudfront之类的内容投放网络服务。

当带宽和存储的低成本比访问速度更为关键时,Amazon S3是理想的选择,而Cloudfront则是关于访问速度的全部。

请参阅this链接,了解如何使用S3存储桶设置cloudfront。

答案 2 :(得分:0)

当您的用户在全球分发时,您应启用并使用S3 Transfer Acceleration。这将减少不靠近您的桶区域的用户的上传时间。

除此之外,上传5 MB需要一些时间,具体取决于您的移动连接。因此,您应该在客户端上调整图像大小,然后您可以考虑提前开始上传,例如当用户输入详细信息时,上传已在后台运行。

答案 3 :(得分:0)

用户体验

为了改善用户体验,您应该创建一个以异步方式发出所有请求的类,并在请求状态更改时生成事件。这将允许用户不要等到文件加载并继续使用该应用程序。

此类的一些伪代码:

class FileUploader {
    uploadingFiles: [String]

    func uploadFile(path: String) -> Task {
        uploadingFiles.add(path)

        runInBackground({
            // make all requests here

            runInMainThread({
                uploadingFiles.remove(path) 

                if error {
                    NSNotificationsCenter.default().post('UploadingError', error)
                } else {
                    NSNotificationsCenter.default().post('FileUploaded', path) 
                }
            })
        })
    }
}

这个类不应该由某个特定的屏幕创建,并且可以存储在例如AppDelegate中。每个屏幕始终可以知道现在正在上传的文件数量,以及加载完成后(通过订阅NSNotificationCenter中的ViewWillAppear个事件并取消订阅ViewDidDisappear)。但是,处理错误会更容易在AppDelegate订阅一次。

您甚至可以在屏幕底部(可以从应用程序的各个位置看到)上传状态。

上传

关于将文件上传到s3 - 最好将此逻辑移动到后端,以便您从客户端发出一个请求,后端进行所有必要的工作(保存到s3,保存文件链接到数据库,返回对客户端的响应)。

调整

您只需显示文件太大的警报(如果照片为10 Mb或视频为100 Mb)。之后,如果你有足够的时间,你可以在上传之前尝试调整图片/视频的大小 - 这不是一个坏主意。

答案 4 :(得分:0)

我注意到在配置中包含“区域”可以在 7 秒内加快上传速度。

也许还有其他改进方法,我目前正在研究包括直接端点 URL。或者也许就是这样:https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html