一次网关事故的总结

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点 本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效 阅读详情

张松然,京东商城,商家研发部架构师。丰富的构建高性能高可用大规模分布式系统的研发、架构经验。2013年加入京东,目前负责京麦服务市场的系统研发工作。

本文是记录2015年的一次线上事故,引发的对系统架构和性能的思考,以及如果考虑系统容灾和降级的问题。在大流量高并发下的互联网环境下,如何做到系统稳定,不被异常流量击垮,是我等软件人需要思考和不断优化改造的目标。

问题来了

记得是一个周六的早上,手机就开始不停的震动,拿起一开,是洪水般的报警短信,大概印象记录如下:

  • 网关系统报出性能报警,各种接口超时

  • 网关系统报出方法可用率报警,统计网关调用量峰值 190w+/min

  • Jimdb(redis)出现 failover 主从切换报警,而且相当频繁

  • Jimdb 出现 Connection Lost 报警

  • 联系 dba 对 Jimidb 进行扩容,并调大连接数

  • Jimdb 恢复

  • 网关系统 CPU 使用率飙升,服务器出现宕机

  • 对 Jstack 进行分析,发现 youngGc 异常频繁

  • 通过对 Jmap 进行分析,发现有 sql 会对 mysql 进行全表扫库

网关系统是对外提供 API 服务调用的系统,对使用资源进行监控发现:

  • 网关日志 JMQ 积压 8亿+

  • 网关日志 ES 容量 2T

  • 网关日调用量 8亿+

  • 网关数据库 CPU 使用率 85%

通过 UMP 统一监控平台,可以看到网关调用量,按小时维度统计如下图:

按日维度统计如下图:

当日和时段的调用量已经远高于平时调用量,这种异常的调用量对网关系统造成了极大的压力,对数据库 CPU 使用率情况,按小时维度监控发现(如下图),CPU 使用率随着系统问题恶化,逐步趋近 100%。

去找原因

因为网关系统主要是对外提供 API 服务调用的系统,所以问题极有可能是某个接口的异常调用量引发整个网关出现的问题,通过对报警的排查,最终定位是订单查询接口调用量异常猛增,引发的整体网关系统的问题,接口调用量数据也对得上,见下图:

但这种连带问题是如何发生的?

下图是对网关系统出现问题的分析:

网关系统分为网关接入层、网关应用层和网关监控共三个部分,网关接入层又包括网关防御校验和网关接入分发两块。分析问题原因,大致过程如下:

问题一、网关调用需要对调用进行实时监控,监控包括网关性能和网关错误,而这些数据都是通过 jimdb 进行存储的。而当网关调用量异常猛增时,造成了 jimdb 的分片热点,由于 jimdb 的资源不足,造成 jimdb 不停 failover,很快恶化服务不可用。

问题二、网关调用日志是网关监控的重要部分,日志是通过 jmq 发送到 es 中存储。当网关调用量异常猛增时,请求 jmq 的连接不足,而发送给 jmq 的消息也开始挤压,最终发送日志的线程造成服务器线程数高,线程切换,以及内存回收等,形成 jvm 频繁的 young gc,并且 jmq 也近乎不可用。

问题三、网关接入层中防御校验逻辑中校验 token 和 pin 的业务依赖于 jimdb,而当 jimdb 不可用时,代码会穿透 jimdb 进行查询 mysql,进而对大量请求访问 msyql,造成 mysql 巨大压力,最终 mysql 恶化成服务宕机。

问题四、jimdb 穿透造成 mysql 宕机,网关应用层查询数据库中的 sql 大量超时,再次对网关系统形成压力,而网关防御层的一些代码 bug,造成参数丢失,形成查询数据库进行全库扫描,系统最后一颗稻草断了,网关系统崩塌了。

快速抢救

通过问题看到网关系统的架构存在着不合理设计,异常流量下,重启服务器已经无济于事。需要迅速进行止损,既然分析出了问题点,就针对问题点进行补丁式的抢救,大概思路如下:

解决问题一、对网关性能监控功能进行降级,毕竟不是核心主流程,没有该功能网关还是可以调用,降级之后不再进行 jimdb 数据存储。后期也需要考虑改造其他方案。

解决问题二、对网关日志功能也可以进行降级,同样不是核心主流程,由于是单个接口的引发的灾害,可以针对网关接口的日志进行黑名单处理,对调用量大的接口调用日志不存储离线日志。

解决问题三、由于不可理设计形成了 jimdb 热 key,暂时无法解决,所以改造在调用 jimdb 之前增加 jvm cache 防御热点,同时修复代码 bug,以及对 jimdb 进行拆离,将网关日志的 jimdb 和网关校验使用的 jimdb 进行隔离部署,实现互不影响。

解决问题四、网关系统是需要对异常流量可以进行自动降级和熔断的,设计时不能因为个别接口把整个网关系统打挂,所以在网关接入层,增加了流量控制逻辑,对并发数进行限流,通过令牌桶实现,进而让网关拥有自我保护能力。

解决问题五、网关应用层检查 sql,对可能全面扫库的代码修改,有效保证数据库安全。后期将网关应用层和接入层进行系统隔离部署,真正有效解耦网关接入和处理业务逻辑,完整方案见下图。

想一想

异常流量是怎么造成的?

因为网关是面向客户端提供 API 服务的,客户端发新版,有个逻辑是 5 秒查询一次订单接口,想要做到实时,而客户端升级数量上万后,这种调用量就直接将网关打死了。

这些异常又是怎么消退的?

因为当时客户端与服务端还是 http 无状态请求,客户端登录也是基于该网关,当时尝试通过 http 长链接通知客户端下线,但是效果甚微,网络带宽基本被打满了,是否有效触达客户端都是未知,最终是通过重启服务器,迫使客户端超时重新登录,在登录逻辑中禁止该版本客户端进行访问网关,逐渐实现泄洪的。

这一过程是艰难而漫长的。

而也是这一次事故,促成了对网关系统的改造,实现了客户端 TCP 长链接网关,以及业务服务 HTTP 网关的剥离和构建,也因此深入理解了 Netty、NIO 等技术,并成功应用在业务中。现在 2018年,客户端 TCP 长连接同时在线量进几十万,感触颇多。

想来,每一次问题都可能是一次技术飞跃和成功的机会。

IMU预积分--详细推导过程 IMU预积分推导 阅读详情

相关推荐

Langchain cannot connect with Azure SQL Database

Langchain 无法连接到 Azure SQL 数据库

suiusoar 616

京麦开放平台架构演进与优化之路

作者:张松然。2013年加入京东,目前在京东商城担任京麦卖家工作台服务端负责人。负责京麦平台化转型,实现服务对外开放。主导了京麦网关、京麦平台和消息推送等多个核心系统的开发和架构设计工作...

vivisran的博客 1231

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点)

Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地

走向CTO的路上... 1310

京麦 1的进阶

张松然,京东商城 POP平台系统架构师。对构建高性能,高可用的大规模分布系统有丰富的开发经验,有多年NIO领域的设计、开发经验,对HTTP、TCP长连接技术有深入研究与领悟。* 本文写于...

vivisran的博客 350

谈京东京麦TCP网关的Netty应用实践

张松然,京东商城,商家研发部架构师。丰富的构建高性能高可用大规模分布式系统的研发、架构经验。2013年加入京东,目前负责京麦服务网关的系统研发工作。京麦从2014年构建网关,从HTTP网...

vivisran的博客 603

微服务架构与领域驱动设计应用实践

本篇文章一共分为三个部分,分别是微服务架构的演进过程、具体实践微服务的应用技术和领域驱动设计的意识转变。微服务架构已经渗透到互联网应用的方方面面,而领域驱动设计也逐渐被业...

vivisran的博客 776

GC 为何会导致线程数降低?

作者:张松然简介:京东商城,商家研发部架构师。丰富的构建高性能高可用大规模分布式系统的研发、架构经验。2013年加入京东,目前负责京麦服务市场的系统研发工作。疑惑近期收到一些报警,是方法...

vivisran的博客 927

【实战】一次出口连接数超限事故引发的架构反思:强制代理、NAT 网关与大厂最佳实践

本文是一篇真实案例,结构完整、逻辑清晰的技术博文,围绕“网络出口连接数超限事故”为核心,系统展开了问题分析、架构反思和大厂实践总结,非常适合发布在技术博客、团队知识库或内部总结文档中。

技术广场 1186

一次DPDK高性能网关性能雪崩事故的完整定位过程

本文以一次真实风格的现网UPF/DPDK网关性能故障为主线,描述从“用户投诉业务卡顿”到“定位CPU异常”、“分析网卡队列负载”、“发现NUMA跨节点访问”、“识别RSS配置缺陷”并最终解决问题的完整过程。文章不仅给出故障定位思路,还系统讲解DPDK轮询模型、PMD线程CPU利用率、RSS负载均衡、NUMA架构、网卡队列设计、缓存局部性等核心知识点,帮助网络开发与运维工程师建立面向高性能数据面的系统化排障能力。

MrHeBoYan的博客 406

一次线上事故教会我的:用Redisson分布式限流给API网关装上终极防护盾

凌晨1点47分,告警群炸了。我的订单服务在30秒内收到12万次请求,数据库连接池被打穿,支付回调大面积超时。复盘时发现罪魁祸首不是恶意攻击,而是一次没有限流的秒杀活动预热接口,被监控脚本误打了一晚上。 那次事故之后我做了三件事:写网关限流、写网关限流、把限流方案彻底搞清楚。最终让我安心睡觉的,是 Redisson 这个基于 Redis/Valkey 的 Java 实时数据平台里的分布式限流能力。

gitblog_00952的博客 379

一次深夜断网事故讲起:我是如何用VRRP+BFD,把网关切换时间从3秒降到50毫秒的

本文通过一次深夜断网事故,详细介绍了如何利用VRRP+BFD技术将网关切换时间从3秒优化至50毫秒。文章深入分析了标准VRRP的缺陷,阐述了BFD的毫秒级检测优势,并提供了华为/思科设备的实战配置指南,帮助读者构建高可用网络架构。

weixin_30299709的博客 293

一次诡异的DPDK网关性能下降事故:从CPU下降到定位NUMA与RSS双重故障

在高性能DPDK系统中,最棘手的问题往往不是程序崩溃,而是系统“还能运行,却跑不满”。本文以现网UPF故障为背景,通过“CPU利用率下降但丢包率上升”的反常现象为切入点,完整展示从业务告警、现象收集、性能分析、PMD线程排查、RSS负载均衡验证、NUMA拓扑分析,到最终定位缓存失效和跨NUMA访问问题的全过程。文章深入讲解DPDK轮询模型、CPU利用率误区、RSS机制、NUMA架构、缓存局部性、Descriptor Ring设计等核心知识点,帮助开发人员建立面向100G网络系统的系统化性能分析思维。

MrHeBoYan的博客 551

IT运维事故

(此文记录运维事故,为类似问题提供参考。) 大约下午4点,发现一台主机web应用无法访问,迅速启动远程桌面管理,结果是无法响应,此时ping主机地址不通。 此时去机房查看问题,刀箱显示面板报8errors,点击面板选择键,异常缓慢。与hp客服沟通后初步判断为刀箱OA故障,等待备件到达。 等待期间,发现与故障主机同段地址中的一台主机无法访问,此时开始怀疑为网络...

weixin_34391854的博客 1098

gateway 内存溢出问题_记一次Netty「直接内存溢出」导致线上网关项目宕机排查过程...

作为一名Java开发者,我们都知道Java进程是运行在Java虚拟机上的,而Java进程要想正常运行则需要向计算机申请内存,其中主要为Java对象实例所占用的堆(heap)内存(当然还有其他的也会占用内存,比如栈等),这些内存一般划分为Java虚拟机所占内存。在当今网络通信过程中,不可避免地需要用到高性能IO通信框架Netty,Spring Cloud Gateway也不例外用到了Netty进行网...

weixin_29838501的博客 1747

一次数据丢失事故谈嵌入式网络编程的防错设计

本文基于LWIP协议栈的实战经验,探讨嵌入式网络编程中的防错设计。通过分析TCP接收窗口更新机制和常见陷阱,提供内存管理、连接状态处理和多任务同步的解决方案,帮助开发者构建更可靠的嵌入式通信系统。

1023

生产网络故障复盘:网络分割与灰度发布事故

一次VPC路由变更引发全站网络分割事故。网络团队新增10.20.0.0/16路由指向NAT网关时,未评估其与默认路由0.0.0.0/0的隐性竞争,导致NAT网关SNAT表溢出。连锁反应包括:VPC DNS递归查询失败→CoreDNS解析超时→Kubernetes Service无法获取endpoint→Envoy返回503→数据库连接池耗尽。根因是变更评估缺失路由优先级、DNS依赖链及跨团队协同不足。关键教训:网络变更需全面评估依赖路径,NAT网关资源需隔离关键流量,健康检查应覆盖核心依赖。(149

SilentSamsara的博客 370

一次血亏5万的采集事故:当 Node.js 爬虫在重型风控前“裸奔”

拒绝做底层协议苦工,在网关层抛弃反反爬的纠缠:[ClawEngine 官网链接]。我们切换到 **ClawEngine 环境网关** 代理出口。3. **HTTP/2 协商陷阱**:在特定 Window Size/Settings 帧回应上被精确标识为非人。}).then(res => console.log('完美获取数据'));1. **Cipher Suites 序列差**:非浏览器特有套件排列。2. **GREASE 伪装标志缺失**:缺乏原生浏览器的兼容伪字段。### 死于协议层裸奔。

ykdykd0926的博客 24

Python 数据管线事故复盘:为何一个脚本错误影响了全链路

这次事故根因是"数据操作缺乏防御性编程"和"DAG 依赖缺乏容错"。修复分三层:代码层(所有数学运算加除零保护、空值检查)、管线层(强依赖和弱依赖分级)、流程层(上线前必须跑全量数据测试)。最关键的认知:数据管线不是"Script 的集合",而是"数据产品的生产线"。生产线上的任何一个环节都要有"部分降级"的能力——断了一条辅线,主线还得跑。

好代码自己会说话,烂代码才需要注释来圆谎 2957

一次网络抖动引发的数据案——毫秒级并发穿透分布式事务防线过程实录及问题处理

就在今天,业务监控系统突然弹出告警:某招标项目的报名记录中出现两条完全一致的报名数据。登录数据库查看发现,两条记录的`user_code`(用户标识)、`tender_id`(招标项目ID)、`create_time`(创建时间)等核心字段完全相同,甚至精确到毫秒级的时间戳都分毫不差。更诡异的是,后续生成的缴费记录虽然创建时间有1-2毫秒间隔,但关联的报名ID却指向了这两条重复的报名记录。文章记录了事故现场、业务流程到问题处理及测试的过程

qq_21330821的博客 1093

账单爆表事故:单个 Agent 协程跑掉 3000 万 Token,用预算闸门治理非确定性 LLM

在 LLM 应用快速演进的当下,Token 消费成本是技术团队无法回避的核心课题。通过部署多级 Token 预算控制闸门,配合动态模型路由与降级策略,能够在保障业务功能完备性的同时,最大程度减少非必要的花费。大模型的非确定性特征要求我们在架构层面树立起强烈的成本防范意识,使用确定性的工程防线为企业的财务安全保驾护航。

qwe0iop0的博客 3175

线上状态码引发 bug 后的一些总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34143774的博客 160

Netty核心参数调优实战:从线上事故到高并发场景配置指南

在高性能网络编程中,参数调优是保障系统稳定性和性能的关键环节。Netty作为Java领域广泛应用的异步事件驱动框架,其底层基于Reactor多线程模型和零拷贝技术,通过精细化的参数配置可以实现高效的连接管理和内存利用。理解Netty的核心参数原理,能够帮助开发者在高并发场景下避免连接队列积压、内存泄漏等典型问题,从而提升系统的吞吐量和可靠性。本文聚焦于Netty的SO_BACKLOG和WRITE_BUFFER_WATER_MARK等关键参数,结合线上事故案例,深入解析其在高并发推送服务、RPC服务等不同应用

weixin_30768881的博客 348

2025河北省河流水系矢量图层shp数据最新版下载

2025河北省河流水系矢量图层shp数据下载-包含水系线和水系面数据,几千上万条数据,非常细化,坐标系为WGS1984坐标系统

各城市金融科技公司数目(2009-2023年).xlsx

详细介绍及样例数据参见文章:https://blog.csdn.net/samLi0620/article/details/141781719

上一篇: 服务市场前端架构升级
下一篇: 分析 Tomcat 6 引发的定时 Full GC 问题
松然聊技术
博客等级 码龄18年 22粉丝 41原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值