【编者案】本文做者 Rohit Dhall 是一名企业架构师,目前就任于 HCL 科技公司。 Rohit 拥有 18 载的 IT 工做经验,熟悉 java/J2ee 、 P2P 、 DWH 、SOA 等技术。本文介绍了五种微服务系统常见的性能挑战,并探讨了相应的解决策略。java
在IT基础设施中,基于微服务架构的系统变得愈来愈受欢迎,在这种架构中,但凡与业务相关的功能都会由多于一个的应用组成,可是对于整个集成系统的性能而言,这种集成也带来了巨大的挑战。在基于微服务的系统中,功能经过多个服务组合提供,所以存在大量的集成点和接触点。这反过来也加剧了性能负担,甚至会影响系统的总体表现。本文主要讨论一些微服务系统所面临的关键性能挑战,同时也向你们介绍一些可以帮助你们解决问题的技术和模式。设计模式
##集成系统所面临的挑战安全
分布式计算原本就有其自身的挑战,全部这些挑战不只有据可查,而在分布式系统上工做的专业人士几乎天天都在为之困扰,尤为在集成环境中接触点超过了「正常」集成环境时,情形则会更加糟糕。当链接到应用内部或者远程外部系统中其余微服务时,不少环节均可能出错。例如,被链接的微服务可能很是缓慢或宕机,那么若是应用程序没有提早设计好如何处理这种状况,将会对程序的性能和稳定性产生不利影响。服务器
##缓解性能挑战架构
在本节中,笔者将讨论一些方法和设计策略,帮助在基于微服务的环境中实现更好的性能,加强系统的弹性和总体稳定性。负载均衡
###节流模式框架
节流是一种用于规避异常应用的技术,当异常应用发送的请求超过应用程序的处理负载时,可能致使系统过载甚至崩溃。异步
一个实现节流的简单方法是限定单个应用程序的链接数。假设有两个厂商调用微服务从帐户中取钱。其中一个供应商是像亚马逊那样庞大的应用,那么它调用应用的次数要比拥有小众群体的供应商多的多。所以,能够提供这两家厂商两个独立的专用「入口点」,经过节流进行链接限制。这样,大量来自亚马逊的请求就不会妨碍第二个供应商的请求。此外,也能够限制各个协做对象的请求频率,这样发送请求的速度就不会超过微服务的处理速度了。分布式
通常状况下,来自外部服务/系统的同步请求会经过负载均衡器、 HTTP 服务器或其余相似的入口点进行节流限制。微服务
###超时
若是请求的微服务响应缓慢,会使得应用须要花费很长时间才能完成一个请求,应用线程在很长的时间内都处于忙碌状态。这会对应用程序产生级联影响,致使应用或服务器彻底堵塞甚至失去响应。
大多数库(libraries)、 API 、框架和服务器都为各类特定的请求超时提供配置,只需设置读写请求超时、等待超时、链接池等待超时、活跃会话超时等的数值便可,但这些超时须要经过适当的性能测试或 SLA 验证才能肯定。
###专用线程池
另外一个重要的设计是将不一样的任务请求或不一样的微服务链接放到独立的线程池中,就像Bulkheads那样对资源进行隔离。你们不妨设想一下这样的场景,在应用流中须要使用 REST 经过 HTTP 链接五个不一样的微服务,也可使用一个普通的线程池去维持这些链接,若是其中某个服务由于某种缘由出现异常,那么池内全部的微服务都会受到牵连。为了最大限度地减小这种异常的负面影响,将单独的服务放进专门的线程池显然是更明智的作法。这不只能够减小某个异常对其余服务的影响,还能保证应用程序的其余部分继续正常地工做。
这种模式一般被称为Bulkheads模式。下图描述了该模式的示例场景:在左侧,微服务 A 用同一个链接池去请求 X 和 Y 两个服务。若是服务 X 或 Y 其中任何一个行为异常,都将影响链接池的总体表现。若是采用Bulkheads模式,如该图右侧所示,即便微服务 X 被错误操做,也只有 X 池受到影响,微服务 Y 还能够继续正常地为应用程序提供服务。
Circuit Breakers是一种设计模式,能够用来减小任何下游不可访问或故障对系统总体的影响。Circuit Breakers用于检查外部系统/服务的可用性,一旦外部系统或服务宕机,应用程序就能够避免再次发送请求到这些外部系统。这种作法其实也是一种安全措施,能够避免超时或Bulkheads模式因某些故障而致使的没必要要超时。若是下游系统宕机,请求就不必一直等待直至响应超时,以后再收到超时异常的响应。相反,当下游系统处于宕机过程时,Circuit Breakers让请求再也不尝试链接,进而大大地缩减了响应时间。
Circuit Breakers有内置的逻辑来对外部系统进行必要的健康检查,从而确保这些系统正常工做后再开始转发请求。
###异步集成
解耦各个微服务之间的通讯能够避免多数的集成性能问题,异步集成方法是一种解耦机制。若是系统是基于微服务系统设计的,并且各个微服务之间都是点到点的集成,那就须要认真思考如何实现解耦了。任何标准的消息代理系统均可用于提供发布—订阅功能。
##总结
本文主要向你们介绍了集成到基于微服务的框架系统所面临的一些性能挑战,同时也提出了一些帮助你们避免上述的性能问题的系统模式,简而言之,在考虑模式时,异步集成的方法应该是首选,而其余设计模式能够根据具体的集成场景进行选择,从而避免下游系统异常引发的级联反作用,帮助你们更好地解决集成系统的性能挑战。
原文连接:https://dzone.com/articles/performance-patterns-in-microservices-based-integr