微服务架构 : 提升微服务分布式远程调用的可靠性与性能 ( 四 )

导语

在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择。 Circuit Breaker 提供了一个可同时兼顾可靠性与性能的解决方案。

前言

在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择。

当来自某个微服务外部 Client 的远程调用, 要求微服务处理一购买 100 张股票的订单时。

架构师假如只是根据 Time Out 来决定此笔交易的成功与失败, 则整体的微服务的整体架构, 便会很难能同时兼顾性能与可靠性。

本文

当来自某个微服务外部 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 远程调用的 Time Out 时间是 10000 ms; 微服务有更充裕的时间处理服务, 因而可靠性获得较好的保障, 但, 10000 ms 也许太长了, 而使得整体微服务的性能不佳。

所以, 在分布式微服务的架构下, 光设计 “ Time Out” 是不够的。

这也是为什么, 必需要在 Time Out 的架构下, 置入 Circuit Breaker 了

C. Circuit Breaker: 同时能兼顾可靠性与性能

当架构师在微服务的 Client 与微服务间置入 Circuit Breaker 后, Circuit Breaker 将负责监控微服务的状态, 而使得微服务 Client 不致于一直还调用微服务, 当微服务已经无法运作时。

另一方面, 当在微服务的 Client 与微服务间置入 Circuit Breaker后, 微服务外部 Client 远程调用的 Time Out 时间便是:

微服务 Client 远程调用 Circuit Breaker 的时间 + Circuit Breaker 送回信息到微服务外部 Client 的时间。

而这所需的时间便相当的短, 也许只需 1~2 ms。

结论

所以, Circuit Breaker 在整体微服务架构下, 扮演著相当重要的角色; 不仅保障了微服务整体的可靠性, 更不至于因保障了微服务整体的可靠性, 而牺掉牲了微服务整体的性能。

在 GitHub 上有许多关于 Circuit Breaker 的实现。

我将在讨论到 AKKA 时, 再来讨论 Circuit Breaker 的作法与实现。

图一: Circuit Breaker

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯数据中心

敬请收藏:数据中心常用标识的中英文对照

中国的数据中心在不断走向国际化,同时数据中心内的关键标识也逐渐采取了中英文双语标识。 今天,我们整理出腾讯数据中心内部使用的中英文标识对照。敬请收藏以备后续参考...

3154
来自专栏Python疯子

UIWebview与OC交互以及加载失败

Simulator Screen Shot 2016年4月16日 00.27.57.png

761
来自专栏函数式编程语言及工具

PICE(4):MongoDBStreaming - gRPC Protobuf conversion

   前两篇我们介绍了JDBC和Cassandra的gRPC streaming实现。相对MongoDB来说,JDBC和Cassandra支持字符类型的quer...

770
来自专栏ml

caffe源码学习之Proto数据格式【1】

前言:   由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系...

4268
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

842
来自专栏.net core新时代

Spire.Doc组件读取与写入Word

  之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换。最近无...

20410
来自专栏函数式编程语言及工具

SDP(5):ScalikeJDBC- JDBC-Engine:Streaming

  作为一种通用的数据库编程引擎,用Streaming来应对海量数据的处理是必备功能。同样,我们还是通过一种Context传递产生流的要求。因为Streamin...

2574
来自专栏小白安全

某素材网扒下来情人节网页代码

素材网里卖几分钱的 效果图: 演示地址:http://www.17sucai.com/pins/demo-show?id=23136 提供...

2865
来自专栏calmound

匈牙利算法

今天学习了下匈牙利算法,发现这个早在几个月前学过的知识已经忘记的一干二净了,记得当初学习的时候只是看书,看论文,现在要好好的总结下,防止以后再次忘记。 此次总结...

2717
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

802

扫码关注云+社区