【问题标题】:Error propagation in microservices architecture微服务架构中的错误传播
【发布时间】:2019-07-10 18:03:59
【问题描述】:

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

通过这些服务的通信模式看起来像 这个: A -> B -> C.

服务BC 可以抛出异常并向调用者返回500。在服务A 中我需要识别服务BC 是否抛出异常(返回500)。此类问题有哪些常见模式?我在想:

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

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

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

您知道此类问题的任何模式或库/框架吗?

【问题讨论】:

  • 为什么A 需要知道C 发生了什么错误?微服务的一个优点是解耦。如果A 仅与B 通信,则A 不需要知道C 上的错误。 B 负责将错误消息从 C 重新映射到对 A 具有语义意义的内容(最好不要提及服务 C)。
  • 假设前端使用AC 是其他人拥有的外部系统的网关。在前端我想在C 出现故障时显示两条消息“外部系统失败,请联系外部系统所有者”,如果B 出现故障,则显示“我们的系统失败,请联系我们”

标签: java spring rest


【解决方案1】:

对于这种典型的问题,你必须使用Circuit Breaker Pattern。我建议你学习 Hysterix 一个由 Netflix 团队开发的断路器框架。按照这些链接。

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

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

正如 Turing85 所评论的,服务 A 在调用服务 b 和服务 c 时不应受到影响。

【讨论】:

  • 我认为你的回答没有回答我的问题
  • 您可以在断路器回退方法中处理包括自定义消息在内的所有内容,以便妥善处理所有内容。除此之外还有其他手动处理的方法。但是,您可以利用断路器功能。 spring 上的例子正好描述了你的问题。
  • 我相信 Hystrix 正在被 Spring Boot 团队弃用。还有一些其他的实现应该被探索。断路器建议是一个很好的观点。 spring.io/blog/2019/04/16/…
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 2013-04-23
  • 2015-12-26
  • 2018-03-01
  • 2021-11-02
  • 2017-03-19
  • 2018-05-12
相关资源
最近更新 更多