本页面包含 Cloud Storage 最佳实践的索引。您可以快速参考本页面收集的信息,了解在构建使用 Cloud Storage 的应用时的注意事项。
如果您刚开始使用 Cloud Storage,建议您不要从本页面开始学习,因为其中并未介绍有关如何使用 Cloud Storage 的基本知识。如果您是新用户,我们建议您从使用 Google Cloud 控制台发现对象存储空间或使用 gcloud 工具发现对象存储空间开始学习。
命名
流量
对要发送到 Cloud Storage 的流量进行回溯估计。具体来讲,请考虑以下指标:
每秒操作数。对于存储桶和对象以及创建、更新和删除操作,您预期每秒会执行多少次操作。
带宽。在哪个时间范围内将发送多少数据?请考虑使用 Wolfram Alpha 等工具以避免计算错误。
缓存控制。在可公开访问的对象上指定
Cache-Control
元数据有利于减少热门对象或频繁访问对象上的读取延迟。如需了解如何设置对象元数据(例如Cache-Control
),请参阅查看和修改元数据。
妥善设计您的应用以最大限度减少流量高峰。如果您的应用的多个客户端要进行更新,请将更新时间分散到一天内的多个时间。
在设计具有高请求速率的应用时,请注意某些操作的速率限制。了解某些类型的出站流量的带宽限制,并遵循请求速率和访问分配准则。请特别注意自动扩缩功能,并且需要循序渐进地提高请求速率以获得最佳性能。
处理错误时:
请确保您的应用使用重试策略,以避免因大型流量爆发造成的问题。
使用新连接重试,如有可能,请重新解析域名。这有助于避免“服务器粘性”,即重试时会尝试通过同一路径,并命中初始请求所命中的运行状况不佳组件。
如果您的应用对延迟时间较为敏感,请使用对冲 (hedged) 请求。利用对冲请求,您可以更快速地重试并减少尾延迟 (tail latency)。它们可在不缩短您的请求截止时间的情况下实现此目的。缩短请求截止时间会导致请求提前超时。如需了解详情,请参阅《The Tail at Scale》。
了解客户期望您的应用性能达到什么水平。此信息将帮助您在创建新存储桶时选择存储方案和区域。例如,对于分析应用,考虑将计算资源与 Cloud Storage 存储桶共置。
位置和数据存储选项
如需了解如何以最佳方式存储数据,请参阅存储类别和存储桶位置主题。
ACL 和访问权限控制
Cloud Storage 请求按名称引用存储桶和对象。因此,即使 ACL 会阻止未经授权的第三方对存储桶或对象执行操作,第三方仍可以尝试使用存储桶或对象名称发出请求,并通过观察错误响应来确定这些名称是否存在。然后,存储桶或对象名称中的信息可能会发生泄露。如果您担心存储桶或对象名称的隐私性,应采取适当的预防措施,例如:
选择难以猜到的存储桶和对象名称。例如,名为
mybucket-gtbytul3
的存储桶就具备足够的随机性,使未经授权的第三方无法轻易猜到该名称,或者难以从中枚举出其他存储桶名称。避免在存储桶或对象名称中使用敏感信息。例如,您可以将您的存储桶命名为
somemeaninglesscodename-prod
,而不要将其命名为mysecretproject-prodbucket
。在某些应用中,您可能需要将敏感元数据保留在自定义 Cloud Storage 标头(例如x-goog-meta
)中,而不是将该元数据编码到对象名称中。
尽量使用群组来明确列出大量用户。群组不仅可以更好地进行调节,还提供了一种非常有效的方法来同时更新大量对象的访问控制政策。最后,群组的费用更低,因为您不需要为每个对象发出更改 ACL 的请求。
查看并遵循访问权限控制最佳实践。
Cloud Storage 访问控制系统允许您将对象指定为可供公开读取。确保您使用此权限写入的所有对象都是您计划公开的对象。一旦“发布”,互联网上的数据可能会被复制到许多位置,因此,实际上您无法重新掌控使用此权限写入的对象的读取权限。
Cloud Storage 访问控制系统允许您将存储分区指定为可被公开写入。虽然以这种方式配置存储桶可以方便地实现各种目的,但我们建议您不要使用此权限 - 该权限可能会被滥用于分发非法内容、病毒和其他恶意软件,并且存储桶所有者会在法律和财务上对存储在其存储桶中的内容负责。
如果您需要安全地向没有用户账号的用户提供内容,我们建议您使用签名网址。例如,借助签名网址,您可以提供对象的链接,您的应用的客户无需向 Cloud Storage 进行身份验证即可访问该对象。创建签名网址时,您可以控制访问类型(读取、写入、删除)和时长。
数据上传
如果您使用 XMLHttpRequest (XHR) 回调来获取进度更新,请不要在检测到进度停滞时关闭连接并重新打开,这样会在网络拥塞期间产生不良的正反馈环。当网络出现拥塞时,XHR 回调可能会积压在上传信息流的确认 (ACK/NACK) 活动后方,如果在这种情况下将连接关闭并重新打开,将导致占用更多的网络容量,雪上加霜。
对于上传流量,我们建议您设置合理长度的超时时间。为了实现良好的最终用户体验,您可以设置一个客户端计时器;当您的应用长时间未收到 XHR 回调时,该计时器会在客户端状态窗口中更新一则消息(例如“network congestion”(网络拥塞))。发生这种情况时,不要关闭连接并重试。
如需减少每个请求所需的带宽,您可以选择启用 gzip 压缩,这是一种既方便又简单的方法。虽然这种方法需要一些额外的 CPU 时间来对结果进行解压缩,但考虑到节约的网络费用,通常还是很值得的。
以 gzip 格式上传的对象通常也能以 gzip 格式提供。但是,请尽可能避免上传同时具有
content-encoding: gzip
和压缩的content-type
的内容,因为这可能会导致意外行为。我们建议您使用可续传上传,这样即使通信故障中断了数据流,您也可以继续传输数据。您还可以使用 XML API 分段上传来并行上传文件的各部分,这样可能会缩短完成总体上传的时间。
删除数据
有关删除数据的指南和注意事项,请参阅删除对象。您还可以使用用于控制数据生命周期的功能来帮助防止数据被应用软件或用户错误删除。