在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择。
当来自某个微服务外部 Client 的远程调用, 要求微服务处理一购买 100 张股票的订单时。假如:
A. 架构师所设计的微服务外部 Client 远程调用的 Time Out 时间是 2000 ms。
但, 此次微服务外部 Client 远程调用、微服务成功处理这 100 张股票的订单并送回一确认成功的信息到微服务外部 Client 时, 共花费了 3000 ms。所以, 微服务外部 Client 会误认为, 先前所发送的请求已因错误而 Time Out。微服务外部 Client 便又重发了一次 100 张股票的订单。这样的场景, 便使得微服务陷入一极为复杂的逻辑判断: 微服务需判断此 100 张股票的订单为重发或新购?
这例子主要是说明了, 当架构师希望微服务的整体架构有一较好的性能时, 而将微服务外部 Client 远程调用的 Time Out , 设计得无法体现出:
- 微服务 Client 远程调用、微服务处理服务与微服务送回一确认成功的信息到微服务外部 Client, 所需的总体时间时, 便会为整体微服务架构的可靠性带来风险。
- Time Out < 微服务 Client 远程调用所需的时间 + 微服务处理服务的时间+ 微服务送回一确认成功的信息到微服务外部 Client 的时间。
B. 架构师所设计的微服务外部 Client 远程调用的 Time Out 时间是: 微服务
Client 远程调用、微服务处理服与微服务送回一确认成功的信息到微服务外部 Client, 所需最长的总体时间的两倍。
举例:
- 微服务 Client 远程调用、微服务处理服与微服务送回一确认成功的信息到微服务外部 Client, 所需的平均总体时间为 2000 ms。
- 微服务 Client 远程调用、微服务处理服与微服务送回一确认成功的信息到微服务外部 Client, 所需的最长总体时间为 5000 ms。
- 微服务外部 Client 远程调用的 Time Out 时间便是: 10000 ms。
当架构师在微服务的 Client 与微服务间置入 Circuit Breaker 后, Circuit Breaker 将负责监控微服务的状态, 而使得微服务 Client 不致于一直还调用微服务, 当微服务已经无法运作时。
另一方面, 当在微服务的 Client 与微服务间置入 Circuit Breaker后, 微服务外部 Client 远程调用的 Time Out 时间便是:
- 微服务 Client 远程调用 Circuit Breaker
的时间 + Circuit Breaker 送回信息到微服务外部 Client 的时间。而这所需的时间便相当的短, 也许只需 1~2 ms。
在 GitHub 上有许多关于 Circuit Breaker 的实现。我将在讨论到 AKKA 时, 再来讨论 Circuit Breaker 的作法与实现。
本文作者:
方俊贤 (Ken Fang), 曾任职于 IJI, Rational, Telelogic, Borland◦ 有将近二十年在半导体, 电信产业与军事研究单位, 从事软件工程与精益敏捷开发相关咨询服务的经验。 主要专长是精益敏捷开发, 有价值的产品需求挖掘, 使用者行为场景分析, 动态注入框架设计, ROA, 既有软件架构优化, 探索式测试, 敏捷测试与持续集成。
本文转载自 方俊贤_Ken 的 CSDN 博客
原文链接:http://blog.csdn.net/featuresoft/article/details/52187933