使用区域级视图实现弹性控制平面读取

控制平面依赖项是指用于管理应用中资源定义的 API 和元数据服务。 如需构建高可用性、弹性应用并自动执行 Compute Engine 上的部署工作流,您必须隔离这些依赖项。虽然全球 API 端点可在所有区域中提供强一致性,但全球控制平面或远程区域中的任何瞬时延迟峰值或中断都可能会延迟或阻止本地服务。

如需构建可靠的应用,使其能够应对全球 API 中断并在每个区域内独立运行,您可以将服务配置为查询全球资源的区域视图。通过使用区域化只读 API 端点读取资源定义,您的应用将严格与特定区域的控制平面进行通信。这种区域故障隔离可确保您的服务即使在全球中断的情况下也能保持高可用性和响应能力。

支持的资源类型

以下全球资源支持使用区域视图端点:

  • 项目:projectViews 端点提供对全球 项目资源的区域只读 权限。
  • 操作系统映像:imageViews 端点提供对全球 操作系统映像资源 的区域只读权限 。

限制

所有全球资源的元数据都存储在中央全球数据库中。 当您使用标准全球 API 端点创建、读取、更新或删除资源时,Compute Engine 会请求从中央全球数据库读取数据并直接写入该数据库,从而提供强一致性。

区域视图端点从中央全球数据库的区域只读副本读取资源元数据。由于更改会异步复制到这些区域副本,因此在查询区域视图时,您可能会遇到以下行为:

  • 轻微延迟:当您在全球范围内创建、更新或删除资源时, 该更改可能需要长达 60 秒的时间才能复制到所有区域 视图端点。在这段短暂的时间内,从区域视图读取数据可能会返回略旧的数据。
  • 自动回退:如果您在资源完成复制到某个区域之前从区域视图请求该资源,Compute Engine 会自动直接从中央全球数据库读取数据,以便您的 请求仍然成功。

区域视图与全球 API 之间的区别

以下标签页总结了每种资源类型的区域视图端点与标准全球 API 端点之间的区别:

项目

下表总结了项目资源的区域视图端点与标准全球 API 端点之间的区别:

功能 全球 API 区域视图 API
端点 全球 区域
资源网址 /projects/PROJECT_ID /projects/PROJECT_ID/regions/REGION/projectViews
故障域 全球 隔离到指定区域
支持的方法 读写 只读 (Get)
API 配额 使用全球 API 读写配额存储桶 使用区域 API 读取配额存储桶
写后读一致性 强一致性(从中央全球数据库读取) 最终一致性(从区域副本读取)
配额字段行为 返回 quota 数组,使用跨区域扇出在所有区域和可用区中提供实时配额使用情况数据。 quota 数组已从返回的 Project 对象中排除。由于 projectViews 端点严格从区域副本读取数据,并且不执行跨区域扇出以收集配额指标,因此根本不会返回 quota 数组。如需了解配额配置 限制和准确的实时使用情况指标,请查询全球 projects.get 端点。

操作系统映像

下表总结了操作系统映像资源的区域视图端点与标准全球 API 端点之间的区别:

功能 全球 API 区域视图 API
端点 全球 区域
资源网址 /projects/PROJECT_ID/global/images /projects/PROJECT_ID/regions/REGION/imageViews
故障域 全球 隔离到指定区域
支持的方法 读写 只读 (Get 和 List)
API 配额 使用全球 API 读写配额存储桶 使用区域 API 读取配额存储桶
写后读一致性 强一致性(从中央全球数据库读取) 最终一致性(从区域副本读取)

价格

通过区域只读 API 端点访问区域视图不会产生额外费用。与标准全球 Compute Engine API 请求一样,对区域视图端点的请求会使用项目的 标准 API 配额(具体而言是区域 API 读取配额),但不会产生额外费用。

高可用性最佳实践

如需最大限度地提高应用弹性、防止控制平面负载过高,并避免创建单区域热点,请在配置自动化系统和客户端工作负载时遵循以下可靠性实践:

  • 查询本地区域以缩小受影响的区域:将 projectViews 和 imageViews API 请求发送到客户端工作负载或 部署集群运行的确切区域。对于可用区工作负载,请使用父区域。 本地化读取可确保其他区域的网络中断或服务中断不会影响本地服务。
  • 动态检测区域字符串:请勿在共享客户端库或部署模板中硬编码特定的默认区域 字符串。而是从工作负载的本地运行时环境中动态检测其当前执行区域,以便多区域故障转移能够透明地工作。
  • 使用区域配额隔离来应对竞争工作负载: Compute Engine 会针对每个区域强制执行 API 速率限制。一个区域中的流量峰值 或失控脚本会使用该特定 区域存储桶中的读取配额,而不会影响其他关键区域中的 API 可用性或触发速率 限制 (429 Too Many Requests)。

后续步骤