TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践
本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享。
编辑:Cynthia
王启军:华为架构部资深架构师。负责华为的云化、微服务架构推进落地,前后参与了华为手机祥云4.0、物联网IoT2.0的架构设计。曾任当当网架构师,主导电商平台架构设计,包括订单、支付、价格、库存、物流等。曾就职于搜狐负责手机微博的研发。“奔跑中的蜗牛”公众号博主。
导读:随着云时代的来临,软件架构日新月异,各种新技术层出不穷。“微服务”这个词更是如火如荼,得到了业界的广泛认可。但是,微服务并不是银弹,微服务架构下的性能问题在交付项目型的公司尤为重要。
本文主要围绕微服务下的性能问题展开,目的是通过实际问题的解决过程,分析在服务拆分到一定粒度后,服务调用链变长,如何评估、提升整体性能。
一、问题的提出
在架构设计阶段,大家比较关心的几个基本要素包括:性能、可用性、一致性、扩展性、安全性。其中性能问题在起步阶段往往容易被忽略,但随着架构的逐步演进,规模越来越大,性能问题会变得越来越重要,很可能一个小小的改动,就可以节省一半的服务器资源。
那性能到底表现在哪些方面?
● 一个是响应时间,也就是发送请求和返回结果的耗时;
● 另一个是吞吐量,也就是单位时间内响应次数。
当然这两个指标是在一定资源限制下才有意义。例如要占用多大磁盘、多少CPU、多大内存等。吞吐量和响应时间之间也互为影响,虽然这不是绝对的。
平时比较常见的性能问题包括:
● 内存泄露——导致内存耗尽
● 过载——突发流量,大量超时重试
● 网络瓶颈——需要加载的内容太多
● 阻塞——无尽的等待
● 锁——通过限制
● IO繁忙——大量的读写,分布式
● CPU繁忙——计算型常见问题
● 长请求拥塞——连接耗尽
当吞吐量有问题的时候,我们期望通过线程或者进程的方式来扩展,线程的方式比进程的方式要复杂得多,因为线程方式需要考虑共享数据变化的问题。
微服务就是一种进程扩展的模式。我们可以尝试给微服务下一个定义:
一种架构风格。
● 单个服务尽量专注一件事情,高内聚、低耦合;
● 进程隔离;
● 每个服务可以独立的开发、测试、构建、部署;
● 小且灵活;
微服务架构带来的优势包括:
● 交付周期。每个服务可以独立开发、测试和交付,降低周期;
● 快速沟通。小团队开发,降低代码耦合度导致的沟通成本; 业务按服务拆分,新人不需要了解整体架构,上手快;
● 定制化。可以根据市场需求,灵活多变地组合出新的业务场景;
● 隔离性。进程隔离方式,故障范围有效控制;
● 技术栈。可以根据需求,按服务选择不同技术栈;
● 演进优化。可以按照服务粒度进行演进优化;
同时带来的问题包括:
● 架构复杂度。由于服务数量暴增引起的各种复杂的架构问题。例如一致性问题、大量远程接口调用的复杂度;
● 管理成本。服务数量爆炸导致管理、运维成本升高。我们希望交付周期短,周期短必然引起变更快,变更是可用性的天敌。需要通过自动化、可视化的手段解决问题;
● 故障定位。例如一个涉及几十个服务的请求,如何在故障发生的时候快速定位问题;
● 性能损失。原本一次调用可以返回结果,现在需要流经几个或几十个服务才能返回结果,如何提升响应时间的问题; 由于拆分导致的吞吐量降低,如何补偿?云化就意味着可以横向扩展。架构如何实现扩展?提升整体的系统吞吐量。
二、实践过程
第一步,树立目标。
通常你得到的需求是这样的:“速度要快!”“跟以前比,性能不能降低”。很明显,这并不是一个有效的指标。
如何设立目标呢?先列出几种常见却无效的目标。
● 平均响应时间1s
可以看这组数据,[2, 5, 3, 4, 301, 4, 2, 8, 7, 3, 3, 1, 1, 8, 2] AVG(f)=23.6平均响应时间因为一次非常严重的超时导致偏离。无法正确描述响应时间。
● 99%请求要在1S内完成
首先,不同的业务,响应时间不应该相同;
其次,单纯的设定响应时间毫无意义,要在吞吐量之下进行设定;
● 支持100万并发用户?
首先,这并不等于系统吞吐量的设定;
其次,系统目前有多大数据量,增长速度是前提;
● 错误率
指标再高,有错误也没用。
我们可以尝试这样来设定:
例如下单操作,
响应时间95%<1s 吞吐量>10万tps
系统数据量:10亿>订单表>1亿……
增长速度:1亿/年
资源限制:服务器资源……
其他影响因素……
同时,其他目标也要同步设定,例如系统整体可用性、一致性等。
第二步,寻找瓶颈点。
首先进行压力测试。可以从生产环境引流进行测试,测试环境测出来的结果毫无意义。另外,要基于场景测试,单测某个功能无意义。
其次,要进行全面的监控,包括调用链分析,快速定位性能瓶颈点。
第三步,优化。
优化的手段有很多,包括:同步转异步、阻塞转非阻塞、数据冗余、数据拆分、数据合并、压缩、简化业务环节等等。关键取决于应用场景和成本。
服务化框架
如图1所示,一个电商里的详情页面会调用价格、库存、商品等服务,综合展示信息,如果是串行调用,总耗时等于每个服务耗时之和;如果是并行调用,总耗时等于三个服务耗时的最大值,性能提升显著。
还有很多其他的优化点,例如:
● 使用高效的序列化协议,protobuf、thrift等协议要比http+json的方式好很多,可以在服务内部使用;
● 采用长连接,避免重复建立连接导致的性能损失;
● 业务线程和IO线程隔离等。
消息中间件
通过消息中间件可以削峰填谷,提升吞吐量。如图2,下单操作直接发送到MQ即返回,由MQ保障最终一致性,还能够降低响应时间。把依赖关系从强依赖变成弱依赖。也就是说,订单系统的暂时不可用,对下单操作无影响。另外,MQ的吞吐量远远大于关系型数据库,MQ扩展相对要方便很多。
当然,使用MQ也有一定的问题,有一个一致性的时间窗口,对于要求强一致的业务来说,是比较致命的。
分布式缓存
缓存是被用来提升性能的利器。本地缓存不能共享,会导致比较大的内存浪费,另一方面,垃圾回收也会影响业务服务。在微服务架构中,我们普遍要求把状态外置到缓存、数据库中,大型应用多采用分布式缓存。
由于数据库扩展起来比较复杂,带来的后遗症较多,用缓存来平衡数据库的压力是非常好的做法。
分布式缓存,例如redis、memcache,吞吐量大概在10万qps这个级别,相对数据库几千qps来说是一个非常大的提升。
当然,分布式缓存带来的问题就是一致性的问题,什么时候去更新缓存?如果缓存更新失败、数据库更新成功怎么办?
数据库
数据库的优化是非常直接有效的。
以优先级来排序,优化的方式如下:
● 索引、冗余、批量写入
● 减小锁粒度
● 减小复杂查询
● 适当转移事务处理
● 提升硬件性能
● 读写分离
● 分库
● 垂直分表
● 水平分表
● 根据业务情况选择NoSql
三、案例分析
如图3,在电商中,一个价格服务,为了提升写的效率,可以采用消息中间件,为了解决重复提交的问题,(特别是当某个系统不可用的时候,用户会频繁提交,导致人为的风暴)可以通过缓存去做排重。
如果一个用户提交了一百万价格变动信息,另一个用户提交了一个价格修改请求,这个请求会被那一百万请求阻塞很长时间,这时候就需要消息中间件有优先级的概念,如果不能做优先级,可以通过建立多个队列分类来解决问题。
如果一个用户提交了一百万条价格修改,发现其中有一个错了,改了其中一条再提交,按照上述方式会导致新版本被老版本覆盖,我们需要通过建立版本号的方式解决这个问题。
四、总结
● 并不是所有的地方都需要高性能,需要权衡代码可读性维护性,架构复杂度 ;
● 优化之前,找到驱动力;
● 正确对待优化带来的其他问题。
11月9-12日,北京国家会议中心,第六届TOP100全球软件案例研究峰会,华为精益敏捷专家陈军将分享《华为百人团队精益看板演进变革之路》;华为云计算测试经理李超峰将分享《华为云虚拟化质量平台建设实践》。
TOP100全球软件案例研究峰会已举办六届,甄选全球软件研发优秀案例,每年参会者达2000人次。包含产品、团队、架构、运维、大数据、人工智能等多个技术专场,现场学习谷歌、微软、腾讯、阿里、百度等一线互联网企业的最新研发实践。大会开幕式单天体验票申请入口
TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践的更多相关文章
- CI Weekly #11 | 微服务场景下的自动化测试与持续部署
又一周过去了,最近我们的工程师正在搞一个"大事情" --「[flow.ci](http://flow.ci/?utm_source=bokeyuan&utm_medium= ...
- .NET Core 中的 Swagger 应用与微服务场景下的Swagger Api 集成显示
Swagger 与 OpenAPI 的历史来源: Swagger 项目于 2015 年捐赠给 OpenAPI Initiative,此后被称为 OpenAPI.这两个名称可以互换使用.但是," ...
- 微服务架构下 CI/CD 如何落地
本文系云原生应用最佳实践杭州站活动演讲稿整理.杭州站活动邀请了 Apache APISIX 项目 VP 温铭.又拍云平台开发部高级工程师莫红波.蚂蚁金服技术专家王发康.有赞中间件开发工程师张超,分享云 ...
- 【星云测试】Devops微服务架构下具有代码级穿透能力的精准测试
微服务是Devops场景下热门的开发框架,在大型项目中被广泛采用.它把一个大型的单个应用程序和服务拆分为数十个的支持微服务,独立部署.互相隔离,通过扩展组件来处理功能瓶颈问题,比传统的应用程序更能有效 ...
- Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转
原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...
- CI Weekly #5 | 微服务架构下的持续部署与交付
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- 微服务架构下分布式Session管理
转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”. 一.应用架构变 ...
- 微服务框架下的思维变化-OSS.Core基础思路
如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...
- 阿里微服务架构下分布式事务解决方案-GTS
虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...
随机推荐
- 手机APP UI设计尺寸基础知识
从原理开始介绍一下移动端设计尺寸规范 初涉移动端设计和开发的同学们,基本都会在尺寸问题上纠结好一阵子才能摸到头绪.我也花了很长时间才弄明白,感觉有必要写一篇足够通俗易懂的教程来帮助大家.从原理说起,理 ...
- 微软自然语言理解平台LUIS:从零开始,帮你开发智能音箱
今年微软开发者大会Build 2017上展示了一款Invoke智能音箱,受到了媒体和大众的广泛关注.近两年,不少大公司纷纷涉足该领域,使得智能音箱逐渐成为一款热门的人工智能家用电器.智能音箱的兴起也改 ...
- Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
根据已上线的app里总结出来的实用小技巧 相信大家都遇到过ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView来使用, 也会遇到一堆奇奇怪怪的问题, ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi身份验证问题解决方案
在我们的整体bs框架当中前端采用的是MVC+WebApi的处理方式.WebApi使用起来确实很方便但也会有新的麻烦事,就是身份验证. 如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url, ...
- SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤
mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...
- 严苛模式 strictmode
参考链接 http://blog.csdn.net/brokge/article/details/8543145 一.严苛模式-虚拟机策略 虚拟机策略(VmPolicy)能检查内存泄漏,譬如,当关闭一 ...
- [转]在Windows上安装RabbitMQ
原文链接 翻译:xiezc 下载服务器 描述 下载 Windows系统安装程序(来自Bintray) 的RabbitMQ的服务器-3.7.4.exe (签名) Windows系统安装程序(来 ...
- CentOS5.x、CentOS6.x 使用NFS及mount实现两台服务器间目录共享
一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置:centos 5 : portmap:实现RPC(协议 ...
- 【转】在Win7的IIS上搭建FTP服务及用户授权
[转]在Win7的IIS上搭建FTP服务及用户授权 [转]在Win7的IIS上搭建FTP服务及用户授权 FTP服务 FTP是文件传输协议(File Transfer Protocol)的简称,该协议属 ...
- 【转帖】39个让你受益的HTML5教程
39个让你受益的HTML5教程 闲话少说,本文作者为大家收集了网上学习HTML5的资源,期望它们可以帮助大家更好地学习HTML5. 好人啊! 不过,作者原来说的4 ...