本文节选自《架构修炼之道》,作者京东王新栋。

图 | meghan-holmes-779221-unsplash

这里说的传统,是按照网关技术演进的阶段划分的,从同步到半同步,再到全异步,我们将同步和半同步技术下的网关称为“传统”网关,同步网关的意思是从接收请求到调用API接口提供方的过程都是同步调用;半同步则是指将I/O请求线程和业务处理线程分开,但业务线程内部还是同步调用API接口;全异步的意思就比较清楚了,整个链路都是异步请求。接下来介绍“传统”网关会在什么情况下“down掉”。

API网关系统有两大特点,一个是访问量大,另一个是依赖系统多。如下图所示,“单纯”的情况下(比如系统A提供的接口只供网关调用)网关系统要承受比被依赖的系统多数倍的流量,因为API网关是所有依赖API的集合。网关还会通过RPC调用很多底层系统,每个系统的稳定性水平参差不齐,接口的性能也会间接影响网关整体的运行稳定性。因此我们在做防范的时候就要从这两个特点入手。

上面介绍了API网关的两大特点,这两个特点算外部因素,接着再来看一下内部因素。程序都是运行在计算机上面的,计算机的每个部件的利用率和负载水平直接影响程序的运行。比如CPU、内存、磁盘等。另外系统之间的交互还需要网络,这些都需考虑。一段程序在计算机中的运行依赖部件如下图所示。

关注CPU

用户请求在进入网关的时候我们从技术上已经把I/O请求线程和业务处理线程隔离开了,这一点可以利用Servlet3异步特性实现(下面还会详细介绍Servlet3的异步特性),如下图所示。

业务线程池毫无疑问是在CPU里面运行的,线程是计算机CPU最宝贵的资源,我们一定要重点关注CPU利用率和CPU负载。

  • CPU利用率:显示的是程序在运行期间实时占用的CPU百分比。

  • CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。在Linux系统中,我们可以使用uptime或top(使用top会看到更详细的信息)命令来查看系统的负载情况。如果使用uptime命令则会得到如下一行:

11:36 up 23 days, 2:31, 2users, load averages: 1.74 1.58 1.60

最后的loadaverages的意思是系统平均负载,它包含三个数字,这三个数字分别表示1分钟、5分钟、15分钟内系统的负载平均值。我们可以按照1分钟的粒度取第一个数字,从而判定系统负载的大小。

上面的23days说明笔者有23天没有重启过计算机了。

注意,CPU利用率高,并不意味着负载就一定大,两者没有必然联系。

关于这两个概念的理解,我们还可以举一个例子来说明。有8个人在排队玩一个打地鼠的游戏机,要求1分钟之内要打完100个地鼠,如果有人一分钟之内没有完成这个任务,那么就需要重新排队,等待下一轮。游戏机在这里相当于CPU,正在或等待玩打地鼠游戏的人就相当于任务数量。

在玩游戏的过程中,肯定有的人在规定的1分钟之内打完100个地鼠,完成任务之后就离开了,有人没有完成任务而去重新排队,还有可能有新增的人来玩这个游戏,人数的变化相当于任务的增减。有的人拿起打地鼠的锤子就开始玩,一直打完1分钟,而有的人可能在前20秒看手机,后40秒才开始玩打地鼠。把游戏机看作CPU,排队的人数看作任务数,我们说前一种人(任务)的CPU利用率高,后一种人(任务)的CPU利用率低。

当然CPU不会在前20秒休息、后40秒工作,只是说,有的程序可能涉及的计算量比较大,CPU利用率就高,而有的程序涉及的计算少,CPU的利用率就低。不管CPU利用率是高是低,跟后面有多少人(任务)在排队没有必然的联系。

之所以花了一些篇幅来介绍CPU的这两个概念,因为这两个指标实在是太重要了,在线上生产环境中是需要重点监控的。鉴于API网关的访问量大和依赖系统多的特点,如果调用的API性能突然变差,在大访问量的情况下,线程数会逐渐升高,直至将CPU资源耗尽。蔓延到整个网关集群,这就是雪崩的效应。

关注磁盘

磁盘有两个比较重要的指标分别是磁盘使用率和磁盘负载百分比。磁盘使用率比较容易理解,我们重点说一下磁盘负载百分比这个指标。在Linux系统下查看该指标的命令为 iostat -x 1 10 (如果没有iostat ,则需要使用yum install sysstat进行安装),笔者下面的图中示例值还构不成威胁,但如果 %util 接近 100%,则说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈,如下图所示。

程序运行的过程中我们可能都不会关注磁盘的使用,如果处理不当,这有可能是一个“定时炸弹”。网关的特性访问量大,再加上有的程序里面的日志打印不规范,比如日志的级别设置得不合理,把info日志打印出来。即使在日志级别合理的情况下,比如error日志,这时又涉及网关的第二个特性,依赖系统多。当有API返回失败错误的时候,就会有大量的error日志写入磁盘,很容易把磁盘打满,尤其在容器时代,每台服务器分配的磁盘容量相对物理机来说都比较小,如果集群的所有机器磁盘被打满,对网关系统来说无疑是一场灾难。

关注网络

在微服务系统架构下,应用离不开网络,尤其是网关系统,它的特点之一就是依赖系统多。依赖就是RPC调用和网络。在一个RPC环境下,网络占据了一次RPC调用所耗时间的很大比重。网络质量的好坏直接影响了一次请求从进入API网关到返回给用户响应的时间长短。如下图所示,网关到依赖系统B之间的网络突然变差,调用时长增加,在请求访问量多的时候,一请求一线程的模式下,会直接导致API 网关系统的任务线程数增多,如果短时间内不能恢复,则整个API网关的集群所有机器的CPU资源都会被线程耗尽。

同时现有的线上生产环境部署并不能完全保证同机房调用,甚至还有跨地区调用,因此网络是我们要考虑的一个重要因素,同时网络的因素需要和上面讲到的CPU的线程资源相关联去考虑。

现在可以总结一个传统API网关系统会有几种“死”法了,因为依赖的某个系统的API性能突然变差导致请求线程数量逐渐升高直至线程占满了CPU,也就是API网关依赖系统多的特点因素,可以认为是被其他系统“拖死”的。线上生产环境下日志输出不规范,过度打印日志,再加上请求量突然变大,导致清理工具来不及清理日志,最后磁盘满了,可以认为是被日志“打死”的。网络一直是一个除系统本身外最不稳定的因素,在系统之间调用的时候,网络发生故障导致请求变慢,这一点和第一条被其他系统“拖死”类似,只是这次是网络。

查理.芒格有一句名言:“如果我知道我会死在哪里,我将永远不去那个地方”。同样对于一个API网关系统,如果我们知道哪些因素会导致一个网关“挂掉”,那么我们就会提前防范,以避免这种“灾难”的发生。当然并不是宣扬传统网关不好,它也有自己的优势,比如编程模型简单、开发调试运维方便等。如果业务规模较小,比如每天调用量不足千万,或者不到亿级,那么可以继续使用这种类型的网关,甚至达到亿级规模之后再配合有效的容错机制(比如Netflix的zuul1+Hystrix)也可以支撑上亿规模的访问量。不过我们有更好的异步网关解决方案,接下来介绍异步网关技术实现。

本文作者:王新栋

现就职于京东,“程序架道”公众号作者。平时热爱总结与分享,对高性能API网关、线程调优、NIO、微服务架构、容错等技术有较深的研究和实战经验。目前致力于带领团队在平台开放技术领域实现突破。

本书是一本实践性非常强的书籍,所有内容均是作者多年实战经验的总结,从亿级网关,再到亿级分布式系统架构,干货满满,无论你是互联网从业新手还是老司机,相信你都能从书中学到很多东西。

京东7FRESH交易研发负责人 李飚、京东技术中台技术架构部中间件平台部总监 何小锋、京东基础交易平台架构师 肖飞、《亿级流量网站架构核心技术》作者 张开涛、京东数科数据研发负责人,Apache ShardingSphere发起人& PPMC,《未来架构:从服务化到云原生》作者 张亮、京东云中间件研发负责人 李道兵、京东物流研发架构部负责人 者文明、京东技术中台 资深架构师 张晋军、《Spring Boot 2 精髓》作者 李家智、自媒体 纯洁的微笑作者 张强、京东无界零售赋能事业部无界产品研发部负责人 陈有存、京东平台生态部 首席架构师 欧阳兴文、《架构探险》作者 黄勇、携程金融 技术总监 李勇、京东京麦平台研发负责人 王栋 联袂推荐。

往期推荐:

架构修炼之道 | 一个传统网关系统有几种 “死” 法相关推荐

  1. 一个区块链项目的40种死法 |链捕手

    区块链项目的死亡高峰期已至,它们为何会失败?很多人认为是因为熊市,但真凶却另有答案. 应链捕手邀稿,AlphaCoin Fund创始合伙人Frank撰写了本文,展示出可能导致区块链项目死亡的八大方面. ...

  2. 程序员架构修炼之道:软件架构基本概念和思维

    引子 互联网发展到今天,软件系统早就不是一个万行代码加上一台服务器这样的作坊玩具.BAT的服务器规模已经达到甚至超过百万级.传统企业向互联网的靠拢,势不可挡. 优秀的软件系统架构师就像大海航船舵手,指 ...

  3. 程序员架构修炼之道:如何设计“易理解”的系统架构?

    前言 尽管"可靠性"有时被视为"可用性"的同义词,但这一属性实际上意味着系统的所有关键设计的保证:可用性.持久性和安全不变量等. 我们构建易于理解的系统的主要指 ...

  4. VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法

    1.vtkVolumeMapper vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能.该类的继承关系如下图所示: 应该掌握一些常用的体绘制类. 2 ...

  5. VTK修炼之道31:图像二值化_阈值法

    1.阈值法实现图像二值化操作 二值图像和label图像是图像分割中经常用到的两种图像. 二值图像的每个像素只有两种可能的取值,例如0或者255.通常0代表图像的背景,而255代码图像前景.图像二值化是 ...

  6. 【java】算法题:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级台阶总共有多少种跳法?列举所有跳法

    解题: 跳上1级1种方法    1 跳上2级2种方法    11,2 跳上3级4种方法    111,12,21,3 跳上4级8种方法    1111,112,121,211,22,13,31,4 - ...

  7. 传统企业转型互联网的十大死法

    传统企业转型互联网的十大死法(转) 2013年,被很多媒体称之为"电商年",因为2013年电商企业都得到了长足的发展,收获满满.而2013年又被很多媒体称之为"关店年&q ...

  8. 【系统架构师修炼之道】(1):『序』

    系统架构师是一个很虚的职位,也是很多程序猿追求的目标,它代表了一定的技术高度,特别是当今互联网时代,真正懂架构的人不多,我希望能写下笔记,记录我的成长一步步成长历程,希望能和大家一起分享,一起共勉. ...

  9. 秒杀系统的架构解决之道

    http://www.infoq.com/cn/articles/solution-to-the-architecture-of-spike-system 本文将会从三个方面来分别探讨如何设计应用架构 ...

最新文章

  1. 缩进一个字符_解析Word——Word段落格式中的几种缩进(中)
  2. BOM--window对象
  3. Debian下面修改Grub2的默认启动顺序
  4. Java DatagramPacket 中的坑
  5. python机器学习案例系列教程——基于规则的分类器
  6. java方法 将123转换成 “一百二十三”
  7. 用 Delphi 下载网络文件
  8. 股市投资必修课十九---DCF三要素经营存续期、现金创造力、经营周期定位
  9. Ant Design + React 中将分页组件的英文转为中文
  10. IBM 开源J9 JVM
  11. 阿里云云效平台使用——Windows上使用阿里云云效(RDC)Git拉取代码
  12. Excel使用VBA动态设置打印区域
  13. Linux设备驱动模型
  14. 使用unity的mesh绘制三菱柱的碰撞体(3d三角形)
  15. k阶子式、主子式、顺序主子式、余子式、代数余子式
  16. bom树形结构 表设计_BOM模块常用表结构
  17. 球差电镜测试常见的问题及解答(一)
  18. 密码学Chapter4、5作业
  19. Python学习笔记(一)三步走安装pip
  20. Android程序员:如何成为一个更好的Android开发者?经典好文

热门文章

  1. 简单版的三子棋小游戏
  2. 垃圾回收机制与内存分配策略
  3. 微型计算机如今的cpu,填补x86处理器“大小核心”的空白,英特尔Lakefield处理器简析...
  4. 走向永无止境的语言学习架构
  5. java两个成语交叉,形容相互交叉的成语-交叉出现的成语-互相交叉在一起的成语...
  6. 通过拉卡拉支付上市研判第三方支付发展前景
  7. JDK的下载安装与环境部署(超详细)
  8. 5G+AI时代下,机器人将迎来怎样的产业未来?
  9. ZED相机 C# Api环境配置
  10. 计算二个时间内有多少个交易日