使用grpc的时候,线上php客户端调用go服务端,出现2/5/14等状态码,没有做日志输出,导致问题查了很长时间,最终问题是因为连接没有close掉,连接数不够了。
grpc的状态码在google.golang.org/grpc/codes:codes中,整理下状态码的翻译:
0:Ok:返回成功
1:Canceled:操作已取消
2:Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误
3:InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的参数
4:DeadlineExceeded:意味着操作在完成之前过期。 对于更改系统状态的操作,即使操作成功完成,也可能会返回此错误。 例如,服务器的成功响应可能会延迟足够的时间以使截止日期到期
5:NotFound:表示找不到某个请求的实体(例如文件或目录)
6:AlreadyExists:表示尝试创建实体失败,因为已经存在
7:PermissionDenied:表示调用者没有执行指定操作的权限。它不能用于因耗尽某些资源而引起的拒绝(使用ResourceExhausted代替这些错误)。如果调用者无法识别,则不能使用它(使用Unauthenticated代替这些错误)
8:ResourceExhausted:表示某些资源已耗尽,可能是每个用户的配额,或者整个文件系统空间不足
9:FailedPrecondition:表示操作被拒绝,因为系统不处于操作执行所需的状态。例如,要删除的目录可能不是空的,rmdir操作应用于非目录等。可能帮助服务实现者判断FailedPrecondition,Aborted和Unavailable之间的试金石测试:使用不可用如果客户端只能重试失败的呼叫。如果客户端应该在更高级别重试(例如,重新启动读取 - 修改 - 写入序列),则使用中止。如果客户端不应该重试直到系统状态被明确修复,则使用FailedPrecondition。例如,如果“rmdir”由于目录非空而失败,应该返回FailedPrecondition,因为客户端不应该重试,除非他们首先通过从目录中删除文件来修复该目录。如果客户端在资源上执行条件REST获取/更新/删除并且服务器上的资源与条件不匹配,则使用FailedPrecondition。例如,在相同的资源上发生冲突的读取 - 修改 - 写入
10:Aborted:表示操作被中止,通常是由于并发问题(如序列器检查失败,事务异常终止等)造成的。请参阅上面的试金石测试以确定FailedPrecondition,Aborted和Unavailable之间的差异
11:OutOfRange:表示操作尝试超过有效范围。 例如,寻找或阅读文件末尾。 与InvalidArgument不同,此错误表示如果系统状态更改可能会解决的问题。 例如,如果要求读取的偏移量不在[0,2 ^ 32-1]范围内,则32位文件系统将生成InvalidArgument,但如果要求从偏移量读取当前值,则它将生成OutOfRange 文件大小。 FailedPrecondition和OutOfRange之间有相当多的重叠。 我们建议在应用时使用OutOfRange(更具体的错误),以便遍历空间的调用者可以轻松查找OutOfRange错误以检测何时完成
12:Unimplemented:表示此服务中未执行或未支持/启用操作
13:Internal: 意味着底层系统预期的一些不变量已被打破。 如果你看到其中的一个错误,那么事情就会非常糟糕
14:Unavailable:表示服务当前不可用。这很可能是一种暂时性情况,可能会通过退避重试来纠正。请参阅上面的试金石测试以确定FailedPrecondition,Aborted和Unavailable之间的差异
15:DataLoss:指示不可恢复的数据丢失或损坏
16:Unauthenticated:表示请求没有有效的操作认证凭证
17:_maxCode:这个是最大的状态码
有疑问加站长微信联系(非本文作者)