文档章节

微服务的性能模式

OneAPM蓝海讯通
 OneAPM蓝海讯通
发布于 2016/04/25 17:03
字数 1938
阅读 16
收藏 0

【编者按】本文作者 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

© 著作权归作者所有

OneAPM蓝海讯通
粉丝 94
博文 631
码字总数 1266889
作品 0
海淀
私信 提问
微服务的性能模式

【编者案】本文作者 Rohit Dhall 是一名企业架构师,目前就职于 HCL 科技公司。 Rohit 拥有 18 载的 IT 工作经验,熟悉 java/J2ee 、 P2P 、 DWH 、SOA 等技术。本文介绍了五种微服务系统常见...

丢失的羊羔
2016/04/25
92
0
分布式框架微服务架构 - Shockweb

ShockWeb天网微服务架构是高效的、易用的、可控的分布式框架微服务架构。提供无侵入、无依赖开发模式,易于在主流中间件部署。支持有状态、无状态两种模式,支持原生IOC、 Spring IOC容器。设...

辛巴8
2018/04/18
3.8K
2
如何安全快速的搭建一个微服务架构

在我们探讨Fabric模式之前,我想谈一谈微服务并且从Nginx的角度来看这意味着什么。 大转变: 微服务已经引起了应用程序架构的重大转变。 当我第一次开始构建应用程序时,他们都是差不多的。幻...

java架构
2018/04/15
0
0
都在说微服务,那么微服务的反模式和陷阱是什么(二)

都在说微服务,那么微服务的反模式和陷井是什么(一) http://www.jianshu.com/p/3986239138fe 六、无因的开发者陷阱 名字来自詹姆斯·迪恩演的电影《无因的反叛》(Rebel Without a Cause)...

colincheng
2017/09/25
0
0
《分布式服务架构:原理、设计与实战》第一章分布式微服务架构设计原理

1、从传统单体架构到服务化架构 1.1 JEE架构 JEE将企业级软件架构分为三个层级 : Web 层、业务逻辑层和数据存取层。对应的职能团队,主要包括:用户 交互 UI 团队、后台业务逻辑处理团 队、...

Lienson
01/31
223
0

没有更多内容

加载失败,请刷新页面

加载更多

使用原生css+js+html实现打印A4纸张的功能页面

有时候我们需要使用html+css实现打印A4纸张的功能页面,以下代码实现 <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatibl......

b0cloud
17分钟前
2
0
读组件化之MGJRouter源码第二次的收获与思考

上一次我们写好了一个自定义的 路由类 ,然后我们来制作自己的 库 ,可以用来被 pod 引入 : 库的制作参考:https://www.jianshu.com/p/928d2ab053be 以下是我创建的: 利用上篇提到的 ,组件...

T型人才追梦者
18分钟前
1
0
spring cache、ehcache的使用及集成

项目中需要加缓存,故学习了 1、spring cache、ehcache的使用及集成 2、缓存的命中率等统计数据 一、spring cache 1、概述 Spring 3.1 引入了基于注解(annotation)的缓存(cache)技术 2、...

qkKing
20分钟前
2
0
Windows 10上源码编译Poco并编写httpserver和tcpserver | compile and install poco cpp library on windows

本文首发于个人博客https://kezunlin.me/post/9587bb47/,欢迎阅读! compile and install poco cpp library on windows Series guide to compile and install poco cpp library on windows g......

kezunlin
21分钟前
2
0
if-else-if-else与switch的区别

if-else-if-else: 适合分支较少 判断条件类型不单一 支持取 boolean 类型的所有运算 满足条件即停止对后续分支语句的执行 switch: 适合分支较多 判断条件类型单一,JDK 1.7 之前仅支持 in...

ConstXiong
21分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部