当前位置: 首页 > article >正文

AIP-217 不可达资源

编号217
原文链接AIP-217: Unreachable resources
状态批准
创建日期2019-08-26
更新日期2019-08-26

有时,用户可能会请求一系列资源,而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源,但其中某个位置暂时不可达。此时仍然需要向用户提供所有可用资源,同时告诉客户有部分缺失。

指南

如果查询数据的方法由于若干资源暂时不可达而部分失败,应答消息 必须 包含一个域来表明这一点:

message ListBooksResponse {// 符合请求的书籍。repeated Book books = 1;// 下一页的令牌(如果还有符合请求的书籍)string next_page_token = 2;// 不可达资源。repeated string unreachable = 3 [(google.api.field_behavior) = UNORDERED_LIST];
}
  • 域 必须 是一个重复字符串域, 应该 命名为 unreachable 。
  • 域 必须 包含不可达的、或者阻碍访问所请求集合的资源名字,例如所请求集合的上级资源不可达。
    • 例如整个位置不可达,阻止了访问所请求的本地资源集合,则包含位置资源。
  • 域 必须 包含 服务相对 资源名, 不得 包含完整资源名、资源URI或简单资源标识。有关定义请参考AIP-122。
    • 例如 Book 资源不可达,则 服务相对 资源名 "shelves/scifi1/books/starwars4" 包含在 unreachable 中,而非 完整 资源名 "//library.googleapis.com/shelves/scifi1/books/starwars4" 、/上级相对/ 资源名 "books/starwars4" 、资源标识 "starwars4" 或资源URI。
  • 应答 不得 提供导致所需资源不可达的问题的任何其他信息。
    • 例如应答不能包含额外的域,包括每个 unreachable 条目的错误原因。
  • 服务 必须 提供方法,让用户能够发出具体请求,接收额外错误信息。例如使用标准的Get或List方法,请求不可达集合的上级资源。
    • 服务 必须 允许用户使用更严格的参数重发请求。
  • 出现在 unreachable 中的资源名字 可能 是异构的。
    • unreachable 域 应该 在文档中记录可能包含的资源,注明资源列表可能在将来扩展。
    • 例如整个位置和不同位置的特定资源都不可达,那么不可达位置的名字(如 "projects/example123/locations/us-east1" )和不可达资源的名字(如 "projects/example123/locations/europe-west2/instances/example456" )都将出现在 unreachable 中。
  • unreachable 域 不得 在列表内提供语义上有意义的顺序或结构。换句话说,unreachable 必须 是一个无序列表。
    • 因此 unreachable 域 必须 使用 UNORDERED_LIST 域行为注释(参考AIP-203)。

重要 如果按照规范要求,由于位置或资源不可达,无法返回数据(例如请求列出某个出版商的资源,但该出版商不可达),服务必须终止整个请求,返回错误信息。

分页

在准备分页远程过程调用(例如AIP-132标准List方法)结果时,如果服务遇到不可达资源或集合, 必须 遵照下列执行:

  • 在 unreachable 应答域中包含不可达资源的资源名。
    • 资源名字 必须 是不可达资源或集合的最适当的范围。
      • 例如某地区的特定区域不可达,不可达资源名是区域位置(如 projects/example/locations/us-west1-a )。如果整个地区不可达,资源名是区域位置(如 projects/example/locations/us-west1 )。
    • 如果发现资源不可达,无论分页参数(如 order_by )如何限制, 必须 包含资源名。
  • 如果先前不可达资源恢复可用,分页参数也允许包含这些资源,在后续页中添加它们。
    • 根据分页参数确定包含哪些资源。如果用户没有设定排序规则,遵守文档要求的默认排序规则。
    • 例如在有序分页调用中,地区 projects/example/locations/us-west1 在第一页中不可用。如果包含该地区资源将违反排序规则,那么这些资源不包含在后续页中。
    • 类似的,如果重发同一请求,先前不可达资源恢复可用, 必须 在分页参数约束下添加它们。
  • 如果适当上调资源范围后,不可达资源名数量仍然超过文档要求的最大值,限制应答中返回的不可达资源名数量。
    • 最大值 必须 直接记录在 unreachable 域注释中。
    • 最大值与调用者设定的 page_size 无关。
保持原有行为

如果修改分页行为会产生AIP-180描述的不兼容变更,服务 可以 继续保持以前实现的 unreachable 分页行为,但 必须 在 unreachable 域文档中直接记录具体行为。

适配部分成功

现存API中,默认行为不同于上述指南的(例如API调用返回错误状态而非部分结果),适配 unreachable 模式时 必须 执行下列操作:

  • 必须 保持默认行为,避免行为变更不兼容。
    • 例如默认行为是当任何位置不可达时返回错误,*必须* 保持原默认行为 。
  • 请求消息 必须 包含 bool return_partial_success 域。
  • 应答消息 必须 包含标准 repeated string unreachable 域。
  • 上述两域 必须 同时添加。

如果请求中的 bool return_partial_success 域设定为 true ,API 必须 按照上述指南,填写 repeated string unreachable 应答域。

message ListBooksRequest {// Standard List request fields...// Setting this field to `true` will opt the request into returning the// resources that are reachable, and into including the names of those that// were unreachable in the [ListBooksResponse.unreachable] field. This can// only be `true` when reading across collections e.g. when `parent` is set to//  `"projects/example/locations/-"`.bool return_partial_success = 4;
}message ListBooksResponse {// Standard List Response fields...// Unreachable resources. Populated when the request opts into// `return_partial_success` and reading across collections e.g. when// attempting to list all resources across all supported locations.repeated string unreachable = 3 [(google.api.field_behavior) = UNORDERED_LIST];
}
部分成功的粒度

如果请求的 bool return_partial_success 域设定为 true ,而请求范围超出了API能够合理判断不可达资源能力的粒度,API 应该 返回 INVALID_ARGUMENT 错误,附带说明问题的细节。例如某个API仅在跨集合读时支持 return_partial_success ,如果请求范围限定为特定上级资源集合,则返回 INVALID_ARGUMENT 错误。API支持的粒度 必须 在 return_partial_success 域文档中记录。

理由

使用服务相对资源名

根据AIP-122定义的相对资源名通常是在服务内部或跨服务引用资源的最佳选择,尤其在外部服务明确时。完整资源名严格来说不太好用(例如需要在客户端进行解析),并且对于 unreachable 来说过于具体。资源URI并非与传输无关,因此它们在gRPC标准方法中不可用,而简单资源标识无法提供充足信息,准确指出在异构资源列表中哪个资源不可达。

在应答中提供最少额外错误详情

不可达资源的上下文可能存在敏感信息,系统状态在调用之间也是变化的。因此最好使用更具体的远程过程调用,依赖服务获取特定资源或上级资源的更多详情。这可以让服务在处理上级资源时进行全面检查、判定系统状态。而不是将可能涉密或过期的信息,胡乱塞入遭遇资源不可达的调用中。

不对 unreachable 进行排序

要在许多API之间达成统一, unreachable 内容不存在特定的、有序的语义结构非常重要。如果每个API在标准域中生成特定顺序,无论是客户端或服务器如何实现,都无法保证正确。

每个页都包含 unreachable 资源

每个页都包含 unreachable 资源,允许终端用户立即识别页面是否完整,不需要遍历所有结果。用户未必会分页到末尾,重要的是尽快在页中提示缺少不可达资源。此外,这允许用户识别潜在问题,在后续调用中处理。最后,保留不可达资源信息直到分页末尾,这需要服务在完全隔离的API调用中保持一组相互独立的状态。

使用请求域作为选项

引入新的请求域作为适配部分成功行为的选项,是即能传达用户意图,又能保持默认行为向后兼容的最好的办法。另一种选择,改变默认行为,加入 unreachable 应答域,将导致不向后兼容的变更。预期当某个资源不可达时遇到失败的用户,可能会认为应答成功表示已经包含全部资源。

同时引入域

同时引入请求和应答域,是为了防止只添加一个域时,可能出现无效的中间状态。如果只添加 unreachable ,用户可能假定域为空意味着已经返回全部资源,而实际未必如此。如果只添加 return_partial_success ,用户将无法得知哪些资源不可达。

部分成功的粒度限制

在请求范围的某个粒度级别上,API可能完全无法枚举不可达资源。例如全局性API可能无法提供本地集合级别的粒度。在此场景中,如果 return_partial_success=true 时主动返回错误,可以避免用户遭遇风险:系统存在问题,但用户未收到不可达列表,误以为已经检索全部资源。这与本指南一致:对于无法完整执行的请求,主动返回失败。

历史

分页指南

最初关于填充 unreachable 域的指南的核心思路是:将这些内容视为分页结果。这意味着分页资源与不可达资源不会出现在同一应答(即页)中。用户需要遍历所有结果,才能发现是否存在不可达资源。有关更改的原因,请参考理由部分。

进一步阅读

  • 关于跨集合读,请参考AIP-159。

修订记录

  • 2024-07-29 修改指南格式,添加具体的资源名格式
  • 2024-07-26 修改分页指南要求。
  • 2024-07-19 添加适配部分成功的指南。

相关文章:

AIP-217 不可达资源

编号217原文链接AIP-217: Unreachable resources状态批准创建日期2019-08-26更新日期2019-08-26 有时,用户可能会请求一系列资源,而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源,但其中某个位置…...

C语言,原码、补码、反码

计算机是以补码来存储的 原码:正数最高位为:0;负数最高位为:1 (最高位是符号位) 正数:三码合一 如:2: 原码:0000 0000 0000 0000 0000 0000 0000 0010&#…...

2025年智能合约玩法创新白皮书:九大核心模块与收益模型重构Web3经济范式

——从国库管理到动态激励的加密生态全栈解决方案 一、核心智能合约架构解析 1. 国库合约:生态财政中枢 作为协议的金库守卫者,国库合约通过多签冷钱包与跨链资产池实现资金沉淀。其创新点包括: 储备资产动态再平衡:采用预言机实…...

【Android】Android 打包 Release 崩溃问题全解析:Lint 错误、混淆类丢失及解决方法大全

摘要: 在 Android 项目的 Release 打包过程中,经常遇到诸如 Lint 校验失败、程序闪退、类找不到等问题。本文将详细分析 Android 打包时常见的崩溃原因,特别是如何应对 Lint 报错、混淆引发的类丢失(NoClassDefFoundError&#xf…...

C++ Cereal序列化库的使用

C Cereal 库使用指南 Cereal 是一个轻量级的 C 序列化库&#xff0c;用于将对象序列化为二进制、XML 或 JSON 格式&#xff0c;以及从这些格式反序列化。它支持标准库类型和用户自定义类型的序列化&#xff0c;且无需修改原有类定义。 基本用法 1. 安装与包含 #include <…...

热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索

654.最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大…...

如何查看linux history命令文件

在Linux系统中&#xff0c;history命令用于显示用户在终端会话中执行过的命令历史。默认情况下&#xff0c;这些命令被保存在用户的家目录下的一个隐藏文件中&#xff0c;通常是.bash_history&#xff08;对于bash shell&#xff09;或.zsh_history&#xff08;对于zsh shell&a…...

css易混淆的知识点

子选择器 (>) vs 后代选择器 (空格) 子选择器 (>) 只匹配直接子元素。后代选择器 (空格) 匹配所有后代元素&#xff08;无论嵌套多深&#xff09;。 绝对定位vs相对定位 布局&#xff1a; justify-content 的作用 控制子元素在主轴上的分布方式。常见值包括 flex-start、…...

Java对接智能客服:从0到1构建高并发对话系统的实战指南

引言&#xff1a;智能客服的进化与Java生态的融合 在数字化转型浪潮中&#xff0c;智能客服系统已成为企业服务升级的标配。当传统规则引擎逐步让位于NLP大模型&#xff0c;Java开发者如何构建高效稳定的对话系统&#xff1f;本文将结合阿里云通义千问、百度文心等最新AI能力&…...

【前缀和】矩阵区域和(medium)

矩阵区域和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff1a;代码Java 算法代码&#xff1a;C 算法代码&#xff1a; 题⽬描述&#xff1a; 题⽬链接&#xff1a;1314. 矩阵区域和 给你⼀个 m x n 的矩阵 mat 和⼀个整数 k &#xff0c;请你返回⼀个矩阵 …...

5分钟用Docker Desktop新功能搭建Python+AI开发环境

Docker Desktop 4.25版本通过预置AI开发模板与零配置GPU支持&#xff0c;彻底简化PythonAI环境搭建流程。无需手动安装CUDA、无需配置虚拟环境&#xff0c;3条命令完成从零到模型训练的完整工作流。 一、Docker Desktop新功能核心价值 1.1 预置AI开发镜像库 • 开箱即用的深度…...

一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一&#xff0c;相比CSV文件&#xff0c;Excel是有样式的。Pandas2提…...

BERT-DDP

DDP 代码执行流程详解 这份代码执行的是一个典型的数据并行分布式训练流程&#xff0c;利用多个 GPU&#xff08;可能分布在多个节点上&#xff09;来加速模型训练。核心思想是每个 GPU 处理一部分数据&#xff0c;计算梯度&#xff0c;然后同步梯度并更新模型。 假设你使用 …...

【MySQL】002.MySQL数据库基础

文章目录 数据库基础1.1 什么是数据库1.2 基本使用创建数据库创建数据表表中插入数据查询表中的数据 1.3 主流数据库1.4 服务器&#xff0c;数据库&#xff0c;表关系1.5 MySQL架构1.6 SQL分类1.7 存储引擎1.7.1 存储引擎1.7.2 查看存储引擎1.7.3 存储引擎对比 前言&#xff1a…...

02-redis-源码下载

1、进入到官网 redis官网地址https://redis.io/ 2 进入到download页面 官网页面往最底下滑动&#xff0c;找到如下页面 点击【download】跳转如下页面&#xff0c;直接访问&#xff1a;【https://redis.io/downloads/#stack】到如下页面 ​ 3 找到对应版本的源码 https…...

大模型上下文协议MCP详解(1)—技术架构与核心机制

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. MCP概述 1.1 定义与目标 MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议。它旨在解决AI大模型与外部工具、数据源及API之间的标准化交互问题…...

Windows下安装depot_tools

一、引言 Chromium和Chromium OS使用名为depot_tools的脚本包来管理检出和审查代码。depot_tools工具集包括gclient、gcl、git-cl、repo等。它也是WebRTC开发者所需的工具集&#xff0c;用于构建和管理WebRTC项目。本文介绍Windows系统下安装depot_tools的方法。 二、下载depo…...

解决 vite.config.ts 引入scss 预处理报错

版本号&#xff1a; "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错1&#xff1a;[plugin:vite:css] [SASS] Error&#xff1a;Cant find stylesheet to import vite.config.ts 开始文件错…...

MySQL学习笔记7【InnoDB】

Innodb 1. 架构 1.1 内存部分 buffer pool 缓冲池是主存中的第一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删查改操作时&#xff0c;先操作缓冲池中的数据&#xff0c;然后以一定频率刷新到磁盘&#xff0c;这样操作明显提升了速度。 …...

分布式锁和事务注解结合使用

在分布式系统中&#xff0c;事务注解&#xff08;如 Transactional&#xff09;与分布式锁的结合使用是保障数据一致性和高并发安全的核心手段。以下是两者的协同使用场景及技术实现要点&#xff1a; 一、事务注解的局限性及分布式锁的互补性 维度事务注解&#xff08;Transac…...

全国产压力传感器常见的故障有哪些?

全国产压力传感器常见的故障如哪些呢&#xff1f;来和武汉利又德的小编一起了解一下&#xff0c;主要包括以下几类&#xff1a; 零点漂移 表现&#xff1a;在没有施加压力或处于初始状态时&#xff0c;传感器的输出值偏离了设定的零点。例如&#xff0c;压力为零时&#xff0c…...

使用nhdeep档案目录打印工具生成干部人事档案目录打印文件

打开nhdeep档案目录打印工具&#xff0c;在左侧的模版列表中选中"干部人事档案目录"模版。 然后点击右下角“批量导入行”按钮&#xff0c;选择事先准备好的人事目录数据excel文件完成导入。 人事目录数据excel文件的结构和内容如下&#xff1a; 导入完成后&#xf…...

工作记录 2015-08-24

工作记录 2015-08-24 序号 工作 相关人员 1 更新76.19的D:\FNEHRRD&#xff0c;更新的差不多了&#xff0c;还在测试中。具体情况见附件。 郝 识别引擎监控 Ps (iCDA LOG :剔除了204篇ASG_BLANK之后的结果): LOG_File 20150823.txt BLANK_CDA/ALL 102/947 (10.8%) TIME…...

在 Dev-C++中编译运行GUI 程序介绍(三)有趣示例一组

在 Dev-C中编译运行GUI程序介绍&#xff08;三&#xff09;有趣示例一组 前期见 在 Dev-C中编译运行GUI 程序介绍&#xff08;一&#xff09;基础 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中编译运行GUI 程序介绍&#xff08;二&#xff09;示例&a…...

Compose 适配 - 响应式排版 自适应布局

一、概念 基于可用空间而非设备类型来设计自适应布局&#xff0c;实现设备无关性和动态适配性&#xff0c;避免硬编码&#xff0c;以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用&#xff0c;APP的显示方式…...

光储充智能协调控制系统的设计与应用研究

摘要 随着化石能源枯竭与环境污染问题加剧&#xff0c;构建高效、稳定的新能源系统成为能源转型的关键。本文针对光伏发电间歇性、储能系统充放电效率及充电桩动态负荷分配等技术挑战&#xff0c;提出一种基于智能协调管理的光储充一体化解决方案。通过多源数据融合与优化控制算…...

UE4 踩坑记录

1、Using git status to determine working set for adaptive non-unity build 我删除了一个没用的资源&#xff0c;结果就报这个错&#xff0c;原因就是这条命令导致的&#xff0c; 如果这个项目是git项目&#xff0c; ue编译时会优先通过 git status检查哪些文件被修改&#…...

C语言超详细指针知识(一)

通过前面一段学习C语言的学习&#xff0c;我们了解了数组&#xff0c;函数&#xff0c;操作符等相关知识&#xff0c;今天我们将要进行指针学习&#xff0c;这是C语言中较难的一个部分&#xff0c;我将带你由浅入深慢慢学习。 1.内存与地址 在正式学习指针前&#xff0c;我们首…...

《算法笔记》3.3小节——入门模拟->图形输出

1036 跟奥巴马一起编程 #include <iostream> #include <cmath> using namespace std;int main() {int n,m;char c;cin>>n>>c;for (int i 0; i < n; i) {cout<<c;}cout<<endl;m round(1.0*n/2)-2;//round里面不能直接写n/2&#xff0c;…...

【深入浅出 Git】:从入门到精通

这篇文章介绍下版本控制器。 【深入浅出 Git】&#xff1a;从入门到精通 Git是什么Git的安装Git的基本操作建立本地仓库配置本地仓库认识工作区、暂存区、版本库的概念添加文件添加文件到暂存区提交文件到版本库提交文件演示 理解.git目录中的文件HEAD指针与暂存区objects对象 …...