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

简介: 本文是微服务架构设计系列的第四篇。在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择,本文将通过两个例子为大家分享如何提升微服务分布式远程调用的可靠性与性能。

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

当来自某个微服务外部 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 了。
当架构师在微服务的 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 的作法与实现。


本文作者:

方俊贤 (Ken Fang), 曾任职于 IJI, Rational, Telelogic, Borland◦ 有将近二十年在半导体, 电信产业与军事研究单位, 从事软件工程与精益敏捷开发相关咨询服务的经验。 主要专长是精益敏捷开发, 有价值的产品需求挖掘, 使用者行为场景分析, 动态注入框架设计, ROA, 既有软件架构优化, 探索式测试, 敏捷测试与持续集成。


本文转载自 方俊贤_Ken 的 CSDN 博客

原文链接:http://blog.csdn.net/featuresoft/article/details/52187933

目录
相关文章
|
6月前
|
存储 调度 C++
16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造
大规模数据如何进行语义检索? 当前 SLS 已经支持一站式的语义检索功能,能够用于 RAG、Memory、语义聚类、多模态数据等各种场景的应用。本文分享了 SLS 在语义检索功能上,对模型推理和部署、构建流水线等流程的优化,最终带给用户更高性能和更低成本的针对大规模数据的语义索引功能。
527 57
|
8月前
|
存储 数据挖掘 BI
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
波司登集团升级大数据架构,采用阿里云数据库 SelectDB 版,实现资源隔离与弹性扩缩容,查询性能提升 2-5 倍,总体成本降低 30% 以上,效率提升 30%,助力销售旺季高效运营。
497 9
|
11月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
6月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
SQL 缓存 分布式计算
vivo 湖仓架构的性能提升之旅
聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 **即席分析** 场景,StarRocks 使用占比达 70%,查询速度提升 3 倍,P50 耗时从 63.77 秒缩短至 22.30 秒,查询成功率接近 98%。 在 **敏捷 BI** 领域,StarRocks 已完成 25% 切换,月均查询成功数超 25 万,P90 查询时长缩短至 5 秒,相比 Presto 提升 75%。 在 **研发工具平台** 方面,StarRocks 支持准实时数据查询,数据可见性缩短至 3 分钟,查询加速使 P95 延迟降至 400 毫秒,开发效率提升 30%。
vivo 湖仓架构的性能提升之旅
|
7月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
7月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,