基于DB的gRPC应用中资源版本不符更新条件时应返回何种错误码?
gRPC错误码选择:更新低版本资源场景
我们有一个基于数据库的gRPC应用,其中Go语言定义的资源X如下:
type X struct { id string name string version string }
该应用仅允许version = "2"的资源执行更新操作。
当客户端尝试更新一个version = "1"的现有资源名称时,示例代码如下:
// 该资源已存在于数据库中 x := X{ id: "xyz", version: "1", name: "some name", } UpdateX( X{ id: "xyz", name: "some other name", }, )
此时应返回FAILED_PRECONDITION错误码,具体分析如下:
候选错误码对比
INVALID_ARGUMENT
支持理由:认为该资源无法被更新,请求必然失败,因此属于无效请求。但这个判断并不准确——INVALID_ARGUMENT适用于请求本身存在语法错误、参数格式非法等无需依赖系统状态就能直接判定无效的场景,而本次请求的参数(id、name)本身是合法的。
FAILED_PRECONDITION
支持理由:
- 请求是否可行必须依赖系统状态(数据库中资源的当前版本)才能判定,无法提前预判
- 当前系统不允许该更新,但可以通过修改系统状态(比如先将资源版本升级为2)让后续相同格式的请求变为可接受状态
综上,该场景完全符合FAILED_PRECONDITION的适用场景:操作因系统当前的前置状态不满足而无法执行,且该状态是可以通过其他操作改变的。
内容的提问来源于stack exchange,提问作者Paul Slevin
相关产品推荐
相关产品推荐

