微服务体系结构中的错误传播



假设我有 3 个微服务 - A、B 和 C。

通过这些服务的通信模式如下所示 这:A -> B -> C.

服务BC可以引发异常并向调用方返回 500。在服务A我需要识别服务是B还是C抛出异常(返回 500)。此类问题的常见模式是什么?我在想:

  • 添加到B的响应中C附加字段,该字段将表示导致问题的服务并通过服务传播它,例如,如果服务C将返回500,则该字段将被复制到服务B的响应并传播到服务A。另一方面,如果服务B会导致问题,它会将此字段添加到其 500 响应中,其值表示服务B

  • 识别哪个服务由异常类或错误消息导致异常

这两种方法都有缺点 - 在第一种方法中,我必须处理将此字段附加到响应并将其从服务C到服务B到服务A的传播,如果它想将此行为添加到更多服务中,它涉及通过服务进行大量代码重复。另一方面,在第二种方法的情况下,感觉不对。

你知道这个问题的任何模式或库/框架吗?

我和Google的其他人基于Google专有的Java服务框架为此开发了一个解决方案。

我能用HTTP术语描述的最好的方法如下:

  1. 该解决方案以Service Error Trace的形式在上游(在服务 A 中)提供错误源。
  2. Service Error Trace类似于 Java 堆栈跟踪,不同之处在于服务错误跟踪包含表示错误传播链而不是 Java 类和行号的服务/端点元组列表。
  3. 每个服务都使用负责生成此错误跟踪的错误处理程序进行检测。从头开始创建它,或将新的服务错误元素追加到跟踪。然后,处理程序使用响应端通道将此错误推送到上游(在 HTTP 中,响应端通道类似于 HTTP 响应标头)。
  4. Service Error Trace中的第一项将是错误源。错误的根源是我相信你正在寻求的。

希望能为您提供一些适合您用例的项目想法!

米.

对于这种典型问题,您必须使用断路器模式。我建议你学习Hysterix,这是一个由Netflix团队开发的断路器框架。点击这些链接。

https://github.com/Netflix/Hystrix/wiki/How-it-Works

https://spring.io/guides/gs/circuit-breaker/

正如图灵85所评论的那样,在调用服务B和服务C时,服务A不应受到影响。

最新更新