将下游错误代码转换为 gRPC 错误代码的正确约定是什么?

What is the right convention for conversion of downstream error code to gRPC error code?

假设我在 ServiceA 工作,调用 ServiceB。现在如果 ServiceB returns NotFound、AlreadyExists 或 InvalidArgument 错误代码,我们应该 return 给 ServiceA 的调用者什么?

  1. 基于 documentation 到 gRPC 错误代码,看起来 Internal 是我们应该 return if

    invariants expected by the underlying system have been broken

    我不太确定这个粗体文本是什么意思,是否意味着任何下游错误都应该 return 编辑为 Internal 错误代码?

  2. 例如,NotFound 文档说:

    NotFound means some requested entity (e.g., file or directory) was not found

    这是否意味着我们应该将下游错误和 return NotFound 解析给 ServiceA 的调用者 if ServiceB returns NotFound?

您 return 中端点的状态代码 ServiceA 应该对调用者有意义。您的业​​务逻辑应该规定应该为下游错误 return 编辑什么状态代码。 return 传递下游服务的代码可能有意义,但并非总是如此。

考虑您实施 getUserDetails 端点的情况,该端点从 UserService 调用 getUser 并从 RatingService.

调用 getRatings
  1. If getUser returns NotFound, return NotFound 是有意义的来电者也是因为用户不存在。
  2. 如果 getRatings returns NotFound,你可以 return 一个 Internal 错误作为您没有足够的信息来 return 完整的回复。在这种情况下,如果您 return NotFound 客户端可能会认为未找到用户,但事实并非如此。