数字媒体资源管理与分享

数字媒体是互联网上发展最快的领域之一。根据 Informa Telecoms & Media 在 2012 年进行的市场研究,2017 年仅全球在线视频市场就能达到 370 亿美元1。其他常见的媒体类型包括图像、音乐和数字文档。这种现象级发展的一个驱动力是移动设备的普及,这类移动设备功能丰富,配备了分辨率较高的摄像头、较大的屏幕,并可以提供较快的数据连接。这导致了媒体内容制作和使用量的大幅增加。另外,许多社交网络有将媒体分享作为其系统的一项核心功能的趋势,这一趋势也成了另一个驱动力。与此同时,众多初创公司正努力在这个市场中建立自己的利基领域。

本文将以一个场景为例,从技术方面深入探讨如何使用 Google Cloud Platform 构建数字媒体资源管理与分享系统。

示例场景 - Photofeed

Photofeed 是一家虚构的初创公司,该公司有意开发一款允许用户上传照片并互相分享照片的照片分享应用。此应用还具有社交功能,允许用户对照片发表评论。Photofeed 的产品团队认为,要在这个领域具备竞争力,他们必须使用户能够快速、安全地上传、查看和编辑照片并为用户提供出色的体验。此外,他们希望这款应用可以随着用户和照片数量的增加而轻松扩容。为了实现这些目标,系统还必须拥有高效的流水线,以用于大小调整、剪裁和缩略图生成等照片处理功能。随着业务的发展,该系统必须支持开发团队快速引入新功能。

可扩缩数字媒体系统开发过程中的难题

从头开始开发可支持大量用户并且可存储海量媒体内容的可扩缩数字媒体系统并不是一件容易的事。下表简要介绍了与开发可扩缩数字媒体系统相关的常见技术难题:

  • 提取
    • 系统必须允许最终用户快速、安全地上传媒体对象,同时提供富有吸引力的用户体验。
    • 如果需要修改或重新提取媒体对象,则必须提取并同步媒体对象的元数据。
    • 需要管理定义了所有相关组成部分之间的通信的提取工作流。
  • 存储
    • 为媒体内容提供几乎无限的存储空间,且该存储空间必须可靠、可覆盖全球且经济实惠2
  • 处理
    • 媒体处理(例如,文档格式转换、图像处理和媒体转码)需要用到可扩缩的计算资源。
    • 需要管理媒体处理工作流。
  • 传送
    • 系统必须允许最终用户快速、安全地下载媒体内容,同时提供出色的用户体验。
    • 需要管理传送工作流。
  • 媒体应用
    • 系统需要支持媒体元数据与应用专属领域数据的集成,还允许基于这些数据开发可扩缩媒体应用,例如资源管理应用和内容分享应用。
  • 最终用户体验
    • 系统需要为浏览器、移动设备和桌面应用等多种客户端提供富有吸引力的用户体验。

本文介绍的解决方案演示了 Google Cloud Platform 如何解决上述各个难题。所提出的系统架构通常适用于所有媒体类型。该解决方案可作为软件架构师和软件开发者的参考,便于他们在 Google Cloud Platform 上开发自己的数字媒体系统。

解决方案概览

App Engine、Cloud Storage 和 Compute Engine 是 Google Cloud Platform 的三项功能。如图 1 所示,所有这些产品协同工作,形成了这项数字媒体资源管理与分享解决方案的基础。

所提解决方案的关键组成部分
图 1. 所提出的数字媒体资源管理与分享解决方案的关键组成部分

提取

Cloud Storage 和 App Engine 都在媒体内容提取中发挥着重要作用。在上传过程中,媒体内容会直接从客户端经由 Google 全球网络流入 Cloud Storage。Google 网络覆盖全球,拥有大量带宽,且集成了 Cloud Storage,因此能够从几乎任何地方以低延迟将内容提取到存储空间。Cloud Storage 支持两种常见的上传机制:使用签名网址的 HTTP POST 和 RESTful API

App Engine 旨在为可应对数百万用户的可扩缩网页应用提供支持。您可以在 App Engine 上开发用于内容提取的前端应用。该应用负责进行身份验证,仅允许已获授权的用户上传内容。同时,该应用还管理提取工作流并协同客户端将内容上传到 Cloud Storage。对于浏览器客户端,该应用还会为网页界面实现内容上传功能。对于移动客户端或桌面客户端,界面会留在客户端应用中,而 App Engine 应用会通过 Cloud Endpoints 以 RESTful API 的形式公开提供自己的功能。客户端应用通过调用 API 来进行身份验证及获取 Google Cloud Storage 访问权限。

App Engine 应用的另一个重要作用是提取元数据并使其与媒体内容保持同步。元数据与应用数据一起存储在 App Engine Datastore 或 Cloud SQL 数据库中。具体选择哪个存储方案取决于应用的特征。将元数据提取与媒体内容提取进行同步的方法有好几种,例如:(1) 使用 Blobstore 上传回调网址;(2) 使用 Cloud Storage 对象更改通知;或 (3) 简单地通过 Cloud Endpoints 公开提供 App Engine 应用的相应 API。

存储

Cloud Storage 以低廉的价格为媒体内容提供几乎无限的存储空间。媒体数据具有冗余性。借助 Google 网络,Cloud Storage 中的内容可在全球范围内通过 App Engine、Compute Engine 以及 Google Cloud Platform 外的公共互联网访问。

Cloud Storage 提供多种存储类别供您选择,以尽可能满足您的需求。

处理

Compute Engine 提供卓越的批量计算性能。媒体处理(例如文档格式转换、转码和图像处理)非常适合使用 Compute Engine。在这种情况下,Cloud Storage 同时充当媒体处理流水线的输入源和输出目标。由于 Cloud Storage 与 Compute Engine 完美集成(例如,可通过服务帐号自动进行身份验证),因此可以通过 Compute Engine 轻松访问 Cloud Storage。

媒体处理工作流也由前文提到的 App Engine 应用管理。在媒体内容上传到存储空间后,App Engine 应用会创建媒体处理任务并将其插入 TaskQueue。在 Compute Engine 上运行的媒体处理软件会使用 RESTful API 拉取加入队列的任务并一一执行。App Engine 应用还能维护媒体内容的处理状态和虚拟机的负载信息,以便自动扩缩 Compute Engine 实例。

传送

借助 Google 网络,Cloud Storage 能够在确保低延迟和高可用性的同时通过互联网传送媒体内容。Google 网络会自动为公开内容提供边缘缓存功能,从而大大减少传送费用。

和提取一样,App Engine 应用会处理用户身份验证和授权,并协调客户端对 Cloud Storage 的访问。对于浏览器客户端,App Engine 应用会为网页界面实现媒体内容下载功能。对于移动客户端或桌面客户端,客户端应用会实现界面并通过使用 Google Cloud Endpoints 公开提供的 API 与 App Engine 应用进行通信。

媒体应用

根据元数据和应用数据的可用性,您可以构建各种媒体应用。一些常见的媒体应用示例为资源管理、内容分享和社交游戏,具体取决于应用领域。App Engine 提供一个可扩缩平台来构建媒体应用。App Engine 应用易于构建、便于维护,并可以根据您的流量和数据存储需求的增长而轻松扩容。因此,开发者可以专注于打造核心业务并快速将新功能投入市场。

用户体验

在此解决方案中,App Engine 应用在定义系统用户体验方面发挥着重要作用。如前文所述,对于浏览器客户端,App Engine 应用会为网页界面实现提取、传送和媒体应用方面的功能。对于移动客户端和桌面客户端,App Engine 应用会通过 Cloud Endpoints 以 API 的形式公开提供自己的功能。这些 API 会为客户端的原生界面提供支持。

实现详情

接下来的部分将介绍所提数字媒体解决方案的实现详情。此部分首先列出系统的关键组成部分,最后详细介绍系统的三个重要工作流:媒体提取流程、媒体处理流程和媒体传送流程。

系统组成部分

  • 在 App Engine 上运行的前端应用和媒体应用
    • 对用户进行身份验证和授权,并协调对 Cloud Storage 的访问。
    • 为浏览器客户端实现界面,以及/或使用 Cloud Endpoints 向移动客户端和桌面客户端公开提供 API。
    • 充当系统控制器,并负责管理媒体提取工作流、媒体传送工作流和媒体处理工作流。
    • App Engine 为可扩缩媒体应用提供支持,内置负载平衡和自动扩缩功能。
  • Cloud Datastore
    • 存储媒体内容元数据和应用数据模型。
  • Cloud SQL
    • 存储媒体内容元数据和应用数据模型,是 Cloud Datastore 的替代方案。
  • App Engine 任务队列
    • 将 App Engine 应用与在 Compute Engine 上运行的媒体处理软件进行集成。
  • 图像服务
    • 为 App Engine 应用提供动态图像处理服务,例如缩略图生成、大小调整和剪裁。
  • Cloud Storage
    • 为媒体内容提供可扩缩的高可用性存储空间。您可以使用 RESTful API 和/或签名网址访问该存储空间。
    • 利用 Google 网络获得以下优势:(1) 能够快速、安全地将内容提取到该存储空间以及从该存储空间传送内容;(2) 获得针对公开内容的边缘缓存功能,以减少传送费用。
  • 媒体处理服务器
    • 在 Compute Engine 上执行媒体处理。

媒体提取工作流和媒体处理工作流

媒体提取工作流和媒体处理工作流通常密不可分。图 2 的组成部分通信图对这两种工作流进行了展示。

媒体提取工作流和媒体处理工作流
图 2. 媒体提取工作流和媒体处理工作流
  1. 客户端访问 App Engine 应用以开始上传。根据客户端的类型,此请求可以是:(1) 来自浏览器的简单 HTTP 请求,或 (2) 从移动应用或桌面应用(例如批量上传器)发起的对由 App Engine 应用实现的端点的调用。App Engine 应用负责对客户端/用户进行身份验证并协调 Cloud Storage 访问权限。
  2. 如果客户端是网络浏览器,则应用可以生成一个签名上传网址,指向嵌入在 HTTP POST 表单中的 Cloud Storage。否则,如果客户端是移动应用或桌面应用,则网页应用会返回 Cloud Storage 访问信息以作为端点调用响应。
  3. 无论使用哪种客户端,都可以使用网页表单或 Cloud Storage RESTful API 直接将媒体文件上传到 Cloud Storage。
  4. Cloud Storage 将响应返回给客户端。响应可以是针对基于表单的上传方式的 HTTP 响应,也可以是 RESTful API 响应,具体取决于第 3 步中使用的上传方法。
  5. 如果上传成功,则需要将媒体元数据推送到 App Engine 应用中。您可以使用以下几种不同的方法来简化这个流程:
    1. 对于使用上传表单的浏览器客户端,您可以在上传网址中指定回调网址。浏览器可根据响应重定向到这个网址,且该回调网址中还会嵌入有限的元数据信息。
    2. Cloud Storage 可以使用名为“对象更改通知”[1]的 Cloud Storage 功能在上传成功时通知 App Engine 应用。该通知会包含正在上传的媒体对象的元数据。
    3. 根据 Cloud Storage 返回的内容上传响应,客户端还可以直接调用 App Engine 应用 Cloud Endpoints 以上传元数据。
  6. App Engine 应用将元数据存储在持久存储空间中。您可以基于应用设置从以下两个数据存储方案中进行选择:(1) App Engine NoSQL Datastore,或 (2) Cloud SQL。
  7. 如果需要进行媒体处理,App Engine 应用可以在任务队列中创建一个任务,以启动媒体处理工作流。App Engine 应用还可以根据需要的工作负载启动或关闭虚拟机。
  8. 在 Compute Engine 上运行的媒体处理软件从队列中拉取任务并执行所需流程。
  9. 媒体处理软件从 Cloud Storage 读取媒体内容、对其进行处理并将输出结果存储回 Cloud Storage。

媒体传送和下载工作流

图 3 描绘了媒体传送和下载工作流,并附有详细的说明列表。

媒体传送和下载流程
图 3. 媒体传送和下载流程
  1. 客户端通过联系 App Engine 应用来启动媒体下载。该应用会对客户端进行身份验证和授权,并允许浏览和搜索特定的媒体内容。这一步骤可通过以下两种方法实现:为浏览器客户端呈现网页界面,或使用 App Engine 应用通过 Cloud Endpoints 提供的 RESTful API。
  2. 根据 Datastore 或 Cloud SQL 中的媒体元数据和应用数据,App Engine 应用可以检查应用中定义的内容分享规则,并查找存储在 Cloud Storage 中的内容的访问信息。
  3. 为了安全地从 Cloud Storage 下载内容,App Engine 应用可以生成一个签名网址或向客户端提供 OAuth 访问令牌以及 Cloud Storage 存储分区和对象名称。对于浏览器,这些信息会嵌入网页界面中。对于移动客户端和桌面客户端,这些信息将在第 1 步提到的 RESTful API 的响应中返回。
  4. 客户端通过发送 HTTP 或调用 RESTful API 来向 Cloud Storage 请求下载内容。对于公开内容,Cloud Storage 可利用 Google 网络的缓存功能。如果缓存中存在所请求内容,则该内容将从缓存中返回。否则,会发生以下情况:
    1. 从 Cloud Storage 检索内容并填充缓存。
    2. App Engine 应用允许通过 App Engine 图像服务代理从 Cloud Storage 检索到的内容,以便实时对图像进行大小调整和剪裁。
  5. 向客户端传送媒体内容。

实现方面的注意事项

  • 媒体内容的元数据可以和应用数据一起存储在 App Engine Datastore 或 Cloud SQL 中,具体取决于数据大小、整体数据模型的特征和开发团队的专业知识。例如,如果您的数据有较强的关联性,您可能需要选择 Cloud SQL。但如果您要将反规范化数据调节为一个巨大的数据集,则可能需要选择 Datastore。2012 年的 Google IO 大会对这两种方案之间的取舍进行了详细探讨 (SQL vs NoSQL: Battle of the Backends)。
  • 本文提供的解决方案使用 Compute Engine 进行媒体处理。Compute Engine 允许在支持的操作系统上运行自定义软件和软件包。该平台适用于通用型媒体处理。或者,如果您要进行简单的图像和照片操作,App Engine 可提供一项图像服务,让您能够实时执行图像处理。

示例应用

我们开发了一款示例照片分享应用3,用来演示如何实现媒体资源管理与分享解决方案(如前文所述的解决方案)。该照片分享应用允许用户上传照片并使其可供其他用户查看。用户还可以针对上传的照片发表评论。以下列表详细说明了这一使用场景的关键元素:

  • 用户需要使用有效的 Google 帐号登录方可使用该应用。
  • 用户从本地磁盘上传照片和说明。
  • 上传到该照片分享应用的所有照片都按时间顺序显示。
  • 用户将对所有用户可见的评论添加到任何照片。
  • 显示照片时,可以调整其大小及进行剪裁以适应界面。

此示例应用的源代码托管在 GitHub 下。

总结

Google Cloud Platform 使开发者能够快速构建数字媒体资源管理与分享解决方案,且该解决方案可以轻松扩容以支持数百万用户和数 PB 数据。本文介绍的解决方案结合了 App Engine、Compute Engine 和 Cloud Storage 的强大功能,可以解决数字媒体系统带来的技术难题。


备注

[1] 对象更改通知目前仍是“受信任的测试人员”计划中的功能。

参考

1 OTT Video Revenue Forecasts (2011-2017),Informa Telecoms & Media 于 2012 年 11 月发布。

2 Garnter: Consumers Will Drive Huge Growth for Cloud Storage,Colleen Miller 于 2012 年 7 月发布。

3 Photo Sharing Sample Application,Michael Tang 于 2012 年 10 月发布。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Solutions