【编者按】本文作者 Rohit Dhall 是一名企业架构师,目前就职于 HCL 科技公司。 Rohit 拥有 18 年的 IT 工作经验,熟悉 Java/J2ee 、 P2P 、 DWH 、SOA 等技术。本文介绍了五种微服务系统常见的性能挑战,并探讨了相应的解决策略。
本文系 OneAPM 工程师编译呈现,以下为正文。
在IT基础设施中,基于微服务架构的系统变得越来越受欢迎,在这种架构中,但凡与业务相关的功能都会由多于一个的应用组成,但是对于整个集成系统的性能而言,这种集成也带来了巨大的挑战。在基于微服务的系统中,功能通过多个服务组合提供,因此存在大量的集成点和接触点。这反过来也加重了性能负担,甚至会影响系统的整体表现。本文主要讨论一些微服务系统所面临的关键性能挑战,同时也向大家介绍一些能够帮助大家解决问题的技术和模式。
集成系统所面临的挑战
分布式计算本来就有其自身的挑战,所有这些挑战不仅有据可查,而在分布式系统上工作的专业人士几乎每天都在为之困扰,尤其在集成环境中接触点超过了「正常」集成环境时,情形则会更加糟糕。当连接到应用内部或者远程外部系统中其他微服务时,很多环节都可能出错。例如,被连接的微服务可能非常缓慢或宕机,那么如果应用程序没有提前设计好如何处理这种情况,将会对程序的性能和稳定性产生不利影响。
缓解性能挑战
在本节中,笔者将讨论一些方法和设计策略,帮助在基于微服务的环境中实现更好的性能,增强系统的弹性和整体稳定性。
节流模式
节流是一种用于规避异常应用的技术,当异常应用发送的请求超过应用程序的处理负载时,可能导致系统过载甚至崩溃。
一个实现节流的简单方法是限定单个应用程序的连接数。假设有两个厂商调用微服务从账户中取钱。其中一个供应商是像亚马逊那样庞大的应用,那么它调用应用的次数要比拥有小众群体的供应商多的多。因此,可以提供这两家厂商两个独立的专用「入口点」,通过节流进行连接限制。这样,大量来自亚马逊的请求就不会妨碍第二个供应商的请求。此外,也可以限制各个协作对象的请求频率,这样发送请求的速度就不会超过微服务的处理速度了。
一般情况下,来自外部服务/系统的同步请求会通过负载均衡器、 HTTP 服务器或其他类似的入口点进行节流限制。
超时
如果请求的微服务响应缓慢,会使得应用需要花费很长时间才能完成一个请求,应用线程在很长的时间内都处于忙碌状态。这会对应用程序产生级联影响,导致应用或服务器完全堵塞甚至失去响应。
大多数库(libraries)、 API 、框架和服务器都为各种特定的请求超时提供配置,只需设置读写请求超时、等待超时、连接池等待超时、活跃会话超时等的数值即可,但这些超时需要通过适当的性能测试或 SLA 验证才能确定。
专用线程池
另一个重要的设计是将不同的任务请求或不同的微服务连接放到独立的线程池中,就像Bulkheads那样对资源进行隔离。大家不妨设想一下这样的场景,在应用流中需要使用 REST 通过 HTTP 连接五个不同的微服务,也可以使用一个普通的线程池去维持这些连接,如果其中某个服务因为某种原因出现异常,那么池内所有的微服务都会受到牵连。为了最大限度地减少这种异常的负面影响,将单独的服务放进专门的线程池显然是更明智的做法。这不仅可以减少某个异常对其他服务的影响,还能保证应用程序的其他部分继续正常地工作。
这种模式通常被称为Bulkheads模式。下图描述了该模式的示例场景:在左侧,微服务 A 用同一个连接池去请求 X 和 Y 两个服务。如果服务 X 或 Y 其中任何一个行为异常,都将影响连接池的整体表现。如果采用Bulkheads模式,如该图右侧所示,即使微服务 X 被错误操作,也只有 X 池受到影响,微服务 Y 还可以继续正常地为应用程序提供服务。
Circuit Breakers
Circuit Breakers是一种设计模式,可以用来减少任何下游不可访问或故障对系统整体的影响。Circuit Breakers用于检查外部系统/服务的可用性,一旦外部系统或服务宕机,应用程序就可以避免再次发送请求到这些外部系统。这种做法其实也是一种安全措施,可以避免超时或Bulkheads模式因某些故障而导致的不必要超时。如果下游系统宕机,请求就没必要一直等待直至响应超时,之后再收到超时异常的响应。相反,当下游系统处于宕机过程时,Circuit Breakers让请求不再尝试连接,进而大大地缩减了响应时间。
Circuit Breakers有内置的逻辑来对外部系统进行必要的健康检查,从而确保这些系统正常工作后再开始转发请求。
异步集成
解耦各个微服务之间的通信可以避免多数的集成性能问题,异步集成方法是一种解耦机制。如果系统是基于微服务系统设计的,而且各个微服务之间都是点到点的集成,那就需要认真思考如何实现解耦了。任何标准的消息代理系统都可用于提供发布—订阅功能。
总结
本文主要向大家介绍了集成到基于微服务的框架系统所面临的一些性能挑战,同时也提出了一些帮助大家避免上述的性能问题的系统模式,简而言之,在考虑模式时,异步集成的方法应该是首选,而其他设计模式可以根据具体的集成场景进行选择,从而避免下游系统异常引起的级联副作用,帮助大家更好地解决集成系统的性能挑战。
OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM官方技术博客。
本文转自 OneAPM 官方博客
原文链接:https://dzone.com/articles/performance-patterns-in-microservices-based-integr
相关推荐
所有微服务架构模式中的能力,只有一个客户端且只用http协议。采用 solon 框架,采用 water 一站式服务治理中台(完整支持 solon cloud 接口定义),采用 wood ORM框架,采用集成式网关,集成大量常用网关拦截器,...
本课程是对分布式微服务架构设计模式进行讲解,以亿级QPS的电商网站为例对常见的技术架构进行分析,从高性能,高可用的角度比较各种方案的优劣点,重点讲解使用CQRS模式怎么进行高性能的微服务架构设计,读者学习本...
Java源码分析与常用设计模式,分布式架构的框架结构,底层原理。手写spring mvc,微服务架构 spring 5新特新与源码解析。
基于支付场景下的微服务改造与性能优化
后端:spring+springmvc,linux,mysql事务隔离与锁机制,mongodb,...前段:html5,css3,vuejs,webpack,nodejs,Google V8引擎,javascript多线程,模块化,面向切面编程,设计模式,浏览器兼容性,性能优化 微服务
文档:概要设计文档,可以帮我们处理程序性能瓶颈,程序移植性短板,也方便后期维护拓展,文档输出也方便后期交付和...7.3 设计模式 7.4 单元测试 8 可扩展设计 9 可靠性设计 9.1 故障隔离和自愈 9.2 数据可靠性
定位于:(高性能 -- 使用golang编写,选用高性能组件(emqx,nats,tdengine),基于gozero微服务框架高性能的同时保证服务的稳定性;云原生易拓展 -- 一套代码同时支持k8s,docker,微服务及单体模式部署,便于业务从单体到...
Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式〔Microservice Architect Pattern〕.近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将...
12306 项目中包含了缓存、消息队列、分库分表、设计模式等代码,通过这些代码可以全面了解分布式系统的核心知识点。 12306 铁路购票服务是与大家生活和出行相关的关键系统,包括会员、购票、订单、支付和网关等服务...
Java高并发高性能分布式框架从无到有微服务架构设计 Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务...
定位于:高性能 (使用golang编写,选用高性能组件(emqx,nats,tdengine),基于gozero微服务框架高性能的同时保证服务的稳定性;),云原生易拓展 ( 一套代码同时支持k8s,docker,微服务及单体模式部署,便于业务从单体到...
swoft是基于swoole协程2.x的高性能PHP微服务框架,内置http服务器。框架全协程实现,性能优于传统的php-fpm模式。
基于SpringCloud微服务的商城项目 这是一个 B2C 商城,用户可以登录注册浏览商品下单购买等,使用当下最流行的 SpringBoot+SpringCloud 组合基于微服务的架构模式,各微服务之间通信使用 RestFul 接口进行访问,使用...
鉴于此,除了常规流程之外,本次在设计手机APP的基础上,采用新型的SpringBoot框架及微服务架构,对微服务架构与传统架构进行性能分析,同传统的JavaWeb框架相比,会极大提高了数据响应速度。由于微服务架构本身的...
高性能 -- 使用golang编写,选用高性能组件(emqx,nats,tdengine),基于gozero微服务框架高性能的同时保证服务的稳定性 云原生易拓展 -- 一套代码同时支持k8s,docker,微服务及单体模式部署,便于业务从单体到微服务的...
FXSHOP基于SpringCloud微服务的商城项目这是一个B2C商城,用户可以登录注册浏览商品下单购买等,使用当下最流行的SpringBoot + SpringCloud组合基于微服务的架构模式,各微服务之间的通信使用RestFul接口进行访问,...
SpringBoot+SpringCloud 组合基于微服务的架构模式,各微服务之间通信使用 RestFul 接口进行访问,使用 MybatisPlus 来组合传统 Mybatis 开发的繁琐,使用具有 PB 级搜索性能的 ES 分布式搜索引擎,使用 Redis 来...
加,数据规模的不断增大,单体架构在数据共享中的可扩展性和性能稳定性明显不 足,同时,现有数据共享平台的数据滥用和隐私泄露问题,导致数据共享缺乏必要 的安全保障。 针对上述问题,本文选用 Spring Cloud 技术...