为什么监控和预警对网关如此重要?

  1. 因为网关的流量太大了
    对上百万QPS的系统来说,即使故障只持续1分钟,其造成的影响也是巨大的,网关一旦发生故障,都是大事件。所以,必须有完善的监控,才能第一时间发现并处理问题,将损失降到最低。
  2. 网关是问题排查的起点
    网关是最接近用户的系统,当用户有问题需要排查时,网关是第一个要查的。而且,网关作为流量入口,后面是各个业务线的接口,毫不夸张的说,网关的研发,至少有三分之一的时间被用户和后端服务催着查问题。所以,有一个完善的监控,会大大提高问题排查的效率。
  3. 好奇心
    没开玩笑,我一直认为,好奇心是作为一个程序员唯二最重要的品质(另一个是责任心),维护这么一个庞然大物,难道你不想知道有多少接口流经网关?峰值QPS是多少?接口延迟如何?反正我是很想知道的。

不止网关,其实监控对每一个在线系统来说都是很重要的,网关尤其明显而已。

监控场景分类

1. 系统监控

监控指标: 磁盘利用率、磁盘IO、网络流量、内存占用、cpu占用、GC情况、QPS、响应时间。
监控目的: 了解系统整体运行情况。
场景举例: 比如发现磁盘占用过大时,可以调整日志留存时间和清理频率。比如发现qps、cpu升高,响应时间变长时,就改考虑增加机器横向扩容了。

2. 业务监控

监控指标: 接口流量、接口rt、接口成功率、错误码、用户流量、用户错误码等。
监控目的: 了解业务层面的数据是否正常。
场景举例: 比如观察到某一接口响应时间变长,可以联系该接口对应的下游服务,看对方是否有变更动作引发问题。

3. 全链路监控

监控指标: 请求的完整链路各个阶段的日志、耗时。
监控目的: 便于排查链路耗时过长的问题。
场景举例: 某用户投诉接口耗时很长,这时就可以根据全链路的日志很方便的看出来问题出在哪里。

监控数据采集、计算、存储

1. 数据采集

监控数据的采集有一个原则:异步采集,不影响业务流程。大多是都是将要采集的数据写到日志中,然后运行一个新的进程(客户端)进行日志解析、上传。上传一般都是批量写入到一个消息队列中,比如kafka。
需要注意的是,这个数据采集客户端不要有很复杂的逻辑,比如复杂的正则表达式提取日志中的一些信息。客户端如果占用系统资源(cpu、内存)过大,会影响正常业务,而且通常这种问题很难排查。
我们之前就遇到过一次系统CPU突然升高,各种查业务代码,啥也查不出来,后来才发现是日志采集配置了新的解析规则,正则表达式比较复杂导致CPU突增。
所以,用户监控的日志尽量要打印的足够规范,且容易解析提取有用字段。
关于数据采集客户端的设计,需要在CPU和带宽之间做一个权衡,如果客户端做的工作很多(解析日志、压缩、本地计算),就会占用机器CPU,从而影响业务。监控系统本来是为了保证业务稳定性而存在的,如果反过来影响了业务的稳定性,那就本末倒置了。当然,如果啥都不做,原样把日志采集上去,就会都传输很多无用的信息,占用带宽。不过一般业务服务之间都是同机房调用,带宽占用的敏感程度远没有CPU那么高。

全链路日志采集

这里着重说一下全链路日志的采集。
全链路日志采集涉及到一个能把整条请求链路串联起来的traceId,这个traceId应该产生于请求发起的地方,通常是客户端,然后一路传递,经过的每个环节(包括中间件)都把这个traceId打印到监控数据中,知道最后返回到客户端。
一般各大公司的中间件都做过改造,以便方便的传递这个traceId,甚至可以做到业务无感知。
拿美团来说,美团所有的通信框架、中间件都做了改造,默认传递这个traceId。traceId产生于客户端的网络库,然后放到http的header里,通过http传递到服务端,服务端之间调用使用的是改造过的Thrift协议,在thrift的schema中第一序号为999的参数用来传递traceId,然后这个服务把traceId放到改造过的kafka的消息头中,通过mq传递到数据处理服务,然后数据处理服务有通过改造过的redis客户端访问了一把redis。一路经过的所有中间件都会把带有traceId的信息(rt、应用名、调用栈等)上传到Cat展示出来。Cat是大众点评开源的十分好用的一套监控系统。
于是乎,在业务程序员毫无感知的情况下,一整条链路已经串联起来了。
当然,我们也可以方便的从框架中取出traceId,自己加一些定制的信息到整个链路中。
忍不住再夸一次美团的基础设施,美团不允许重复造轮子,每种功能的中间件都只有一种,且维护的很好,技术支持响应很快,文档、交互界面都很好。相比而言,阿里就不忍直视了。。。
整个流程示意图如下:

2. 数据计算和存储

  1. 但凡数据计算都是有目的的。
  2. 同一份数据,可以有多种计算目的,每种目的对应的计算方式和存储方式也是不一样的。
  3. 数据查询方式决定了数据的存储结构。

Storing data is normally quite straightforward if you don’t have to worry about how it is going to be queried and accessed; many of the complexities of schema design, indexing, and storage engines are the result of wanting to support certain query and access patterns. For this reason, you gain a lot of flexibility by sepa‐ rating the form in which data is written from the form it is read, and by allowing sev‐ eral different read views. This idea is sometimes known as command query responsibility segregation (CQRS)

关于CQRS可以看这一篇:https://blog.csdn.net/xinzhongtianxia/article/details/86545592
接着说数据计算。
API网关的数据跟交易系统有很大不同,主要有以下几个特点:

  1. API网关的数据通常都是流量数据,且数据之间没有关联关系,一次请求就是一条数据。
  2. 数据量巨大,但是数据格式相近,比如同一个接口的不同请求,除了参数值外,其实差别不大。
  3. 数据是源源不断产生的,没有尽头。
  4. 数据的产生时间很重要,通常需要对一段时间内的数据进行计算。

基于以上特点,可以说API网关的监控数据是流式计算和时序数据库的典型应用场景。
关于流式计算和时序数据库,网上有很多优秀的讲解,Flink、Kafka、Hbase等官网的文档、相关论文等也都十分美好、赏心悦目(hbase不是时序数据库,但可以是时序数据库的底座。。),这里就不啰嗦了。
如果有兴趣,建议还是好好看看Google的BigTable论文和LSM Tree的思想。
数据计算和存储的大致示意图如下:

预警

对在线服务来说,发现故障远比修复故障要重要的多。
对在线服务来说,发现故障远比修复故障要重要的多。
对在线服务来说,发现故障远比修复故障要重要的多。
只有监控是远远不够的,监控更多是对系统当前状态的一种展示,而且通常是在系统发生问题之后才会有人去查看监控,所以,得有一种手段,能及时感知到系统的异常,通知运维、研发人员。毕竟不会有人24小时盯着监控大屏。
系统产生异常的原因各不相同,单一的预警手段是不够用的,必须多种预警手段并存,才能保证系统问题能及时发现。
下面分别举例说明一些必不可少的预警场景。

流量同比、环比

对在线服务来说,同比+环比的监控,是一种比较有效的监控手段。
比如发现流量突然下跌,得赶紧看一下下跌原因,是不是系统出问题了。
比如发现流量突然增长,得看一下系统资源是否够用,需不需要扩容加机器,是不是被人攻击了,是不是有运营活动等等。
同环比通常是具有规律性的,比如对出行业务来说,高峰是每天的早晨7点和晚上6点左右。对基金交易业务来说,高峰就变成下午3点了。
周末、节假日和工作日也有很大不同。
对于整体流量和单个接口的流量来说,周期规律还是很明显且稳定的,同环比比较有效。
但是,对于单个用户的流量来说,同环比没啥用了。因为单个用户的行为是不可预测的,比如发现某用户的流量突然下跌了,这时候是报警还是不报警?
报警吧,多半是因为用户自己的问题,比如用户改用别人家的接口了,或者用户网线被挖掘机挖了等等,多数会误报。
不报警吧,万一是因为网关的bug或者管理员操作失误造成对用户的影响呢?自己发现总比用户投诉过来好一万倍吧。
对单个用户的流量怎样预警,一直是个难题。
一种行之有效的办法是,同时满足以下三个条件才报警:

  1. 用户流量大于一定的值,小流量用户监控意义不大,比如是学生注册了账号来学习或者做实验。
  2. 正确流量持续下跌超过一定值。
  3. 正确流量下跌的同时,错误流量有所增加。

同时触发以上三个条件的场景基本只有下面两种:

  1. 用户自身出bug了
  2. 网关管理员操作了用户的配置、策略。

对于第一种,可以反馈给用户,也许我们比用户先发现用户自身的问题。
对于第二种,赶紧采取挽救措施。

系统层面的预警

cpu、硬盘、内存、响应时长、FGC、SQL慢查询等,这些所有服务都不可少,不展开了。

接口不间断健康检查

线上接口,可以找一些测试用例,定时触发,看返回结果是否正确。
这种接口请求级别的监控时很有必要且容易被忽略的。
通过这种监控预警,可以发现一些系统的bug,比如某查询接口的返回值和之前不一样了,需要检查数据源是否有问题,接口逻辑是否有问题。通常这种对系统来说,属于”正常“返回,不在预警范围内。毕竟请求正确返回了,没有错误码。
此类错误,如果没有此种监控手段,就只能等用户反馈了才能发现,那发现的就太晚了。

预警通知

最后说一下预警通知。
一般预警系统可选多种通知方式:短信、钉钉、邮件、电话。
对于研发、运维人员来说,短信、钉钉、邮件是轮询,时效性不够高。我们也许十几分钟甚至几小时才会看一下手机。
电话报警是回调,报警了立马就能知道。
但是,电话报警也要慎用,因为报警的有效率是不可能达到100%的。半夜三点睡得正香,一通电话打来,发现是误报,那感觉真是。。。。

那么,接到报警之后,该怎么办呢?且看下一篇:《大型API网关(七)—— 紧急预案》

大型API网关(六)—— 监控和预警相关推荐

  1. 大型API网关(八)—— 超卖和资源隔离

    超卖 1. 例子 先举个超卖的例子,解释一下什么是超卖. 小高去某运营商办了宽带,100M的,很兴奋,想着看视频肯定不卡了.结果到了晚上,刷视频时,又卡成狗. 第二天白天就又变好了,这是咋回事呢? 聪 ...

  2. 京东大型API网关实践之路

    概述 1.背景 京东作为电商平台,近几年用户.业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生. API网关,就是为了解放客户端与服务端而存在的.对于客户端,使开放给客户端的接口标 ...

  3. 大型API网关(五)—— 限流

    什么是流量限制 通俗的说,流量控制就是控制用户请求的策略,主要包括:权限.限流.流量调度. 权限上一篇已经讲过了,这一篇讲限流,下一篇讲流量调度. 限流是指限制用户调用的频率(QPS/QPM)或者次数 ...

  4. 巧用 API 网关构建大型应用体系架构

    近期阿里云重磅发布了BizWorks一体化的云原生应用的开发和运营平台,内置阿里巴巴业务中台构建的最佳技术实践.BizWorks提供的产品能力,普遍适用于企业云原生应用高效开发以及企业业务能力沉淀和复 ...

  5. spring cloud 入门系列六:使用Zuul 实现API网关服务

    通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通 ...

  6. (六)api网关服务 zuul-过滤器

    开启上文服务: Zuul给我们的第一印象通常是这样:它包含了对请求的路由和过滤两个功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.过滤器功能则负责对请求的处理过 ...

  7. 阿里云API网关(6)用户指南(开放 API )

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  8. 10Wqps 超高并发 API网关 架构演进之路

    说在前面 在尼恩的(50+)读者社群中,经常遇到一个 API网关 架构方面的问题: (1) 尼恩老师,最近公司我们在规划业务出口网关(目的,整合规范外部调用,如短信平台 mqtt 等) 我在做整理技术 ...

  9. API网关产生背景以及kong网关产品介绍

    最近在整理API网关的培训资料,也想来谈一谈我们为什么需要API网关,以及kong网关的一些特性分析.互联网的大环境下,以及微服务架构盛行的今天,为解决企业对外部互联网集成交互的高效和高质量,采用分布 ...

最新文章

  1. centos修改SSH端口并禁用root远程登录
  2. Prompt-Tuning这么好用?
  3. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路
  4. 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化
  5. HTML+CSS---定位(相对定位--绝对定位--固定定位--设置元素的层叠顺序)---表单---设置光标样式---透明度(opacity属性定义元素的不透明度--IE的半透明滤镜)---外边线
  6. 解决 clipboard.js 在ios中失效的问题
  7. java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)...
  8. Spring-beans-ListableBeanFactory/AutowireCapableBeanFactory/HierarchicalBeanFactory
  9. 简单的makefile模板
  10. python怎么读发音百度翻译-用python实现百度翻译
  11. GD32f103介绍第二章
  12. 四川华为EC6108V9C悦me和CA高安版_卡刷固件包
  13. Xshell 6安装和使用教程
  14. 使用js实现百度地图与高德地图经纬度的转换
  15. VMware虚拟机迁移
  16. Python爬取有道词典
  17. ARM中C语言和汇编语言互相调用以及实例
  18. QQ小程序支付 调起微信支付
  19. 证明威尔逊(Wilson)定理及其逆定理
  20. IDEA小技巧之痛苦面具 主菜单不见了怎么办?

热门文章

  1. NiFi分享第一期-安全认证(证书认证)
  2. 关于康托展开的用途及写法
  3. [DAY003]考研数学极限的计算知识点与题目总结(三)
  4. Log4j输出终端(Appender)详解
  5. 树莓派使用PCA9685()出现[Errno 121] Remote I/O error的解决方法
  6. 【web渗透】appscan 免费版下载
  7. 翻译(5): 技术债务墻:一种让技术债务可见并可协商的方法
  8. SC8701 120W DC TO DC 电源模块的设计
  9. npm全局安装和本地安装及卸载
  10. KVM切换器工作原理