线上服务挂了 3 分钟,大神竟然说设计就是这样不是 bug

从一次线上Bug复盘:聊聊Protobuf的SerializePartialToString如何‘救了我们一命’ 本文通过一次线上支付服务故障的复盘,详细分析了Protobuf的SerializePartialToString在紧急修复中的关键作用。文章揭示了proto2到proto3迁移过程中required字段的兼容性问题,并提供了临时解决方案和长期架构改进建议,强调了协议设计中向后兼容的重要性。 阅读详情

在一个风和日丽的下午,刚打算饮茶,线上就开始报警了,一看情况网关报 500 了。

网关(用的是Spring Cloud Gateway)挂了可还行,这可是对外的们,门没了岂不是所有请求都进不来了!

说好的动态调度扩缩容负载均衡呢??怎么没支棱起来?

及时处理

话不多说,直接重启。

然后看起来好了,重启大法!yyds!

问题排查

感觉有点突然,最近网关并没有发版,上一个版本还是在 4 月份,挂的有点莫名其妙。

不过这两天在执行一个动态迁移服务,有大量的请求,预估两天的请求量有 300 w,我一开始以为是被这个打挂了。

但是有关的接口我都加了限流,且请求一直是匀速的,也已经正常处理一天一夜了,服务的各项指标也没任何异常,咋就突然这样了呢?

仔细看了看,网关的服务没挂,但是请求都返回了 500。

上去一查日志:

图片

我擦,这是什么玩意?

看起来是要创建临时目录,然后失败了,因为空间不足,但是实际上我看磁盘空间还很多,这时候我已经有点感觉了。

可以看到是 Spring 的 SynchronossPartHttpMessageReader 类触发的这个报错,网关代码确实有用到 HttpMessageReader 相关的解析。

然后进行一波源码分析:

图片

点进源码粗略了看了下,每个请求的解析都会创建一个临时目录,往里跟了几步看了看,这个临时目录的作用是到时候用来给解析 Multipart 存储临时文件用的。

图片

但最近的请求也都跟 Multipart 没关系了,咱也不懂为啥要这样先预创建。

看到这反正问题已经定位到了:因为网关要用到 HttpMessageReader 相关的解析,而这个解析实现类,每次都会预创建一个临时目录,用来到时候给 Multipart 用(即使实际没这玩意),因此每个经过网关的请求,都会在网关本地服务器上创建一个临时目录。

而由于这两天请求非常多,创建了很多目录,把操作系统的文件 inode 占满了,使得后续的所有请求在执行到创建临时目录的方法时就报错了,因此所有请求都返回了 500。

inode

这边先介绍下 inode。

在类Unix文件系统中,文件的元数据存储的地方叫 inode,也就是文件元数据和文件的数据是分开存储的。

所谓的元数据指的是:文件的大小、创建时间、修改时间、权限等等,它也会占用磁盘空间。

因此操作系统分配给 inode 存储空间也是有限的,超过了限制就申请不了。

所以有时候磁盘空间够的,但是文件还是无法创建,一种可能就是 inode 满了。

对了,对 Linux 这类系统而言,目录也是文件,一样的。

tmp

tmp 目录其实是有讲究的,临时目录。

理论上这个目录默认操作系统会有个叫 tmpwatch 的玩意去清理长时间无用的文件,一般会定时去清理。

图片

而且重启系统的话,这里面的文件也会被清空。

至此,产生问题的原因应该非常清晰了。那如何解决?

解决

  1. 利用 tmpwatch 勤快点去清理,比如近几个小时没用的就直接干了。

  2. 不用 HttpMessageReader

  3. 定时重启

  4. 修改源码

  5. 看看后续版本

第一点不太好,因为有几率误删有用的文件。第二点理论上用了  Spring 体系,这玩意好像不太好避免,先暂定。第三点,太骚了,还是算了。第四点,改起来不难,但是后面升级版本啥的不太方便

先试试第五点。

然后我就去 spring-cloud github 搜一搜,果然有 issue。

图片

点进去一看,关联到另一个 issue,一看巧了,一模一样的错:

图片

然后他圈了好几个老哥,有个叫 poutsma 老哥回答了他的问题:

图片

我简单翻译下:这样的实现是为了解决一个安全问题,为了不创建一个固定的临时目录,如果使用固定目录会带来严重的安全隐患,然后也不能在退出后删除,因为这样会删除所有上传的文件。

简单来说:不是bug。

而且目录本身占用的磁盘空间可以忽略不计,只有当大量上传的文件存储在那里时,目录才会开始占用空间。

通常,操作系统会在一段时间后清理临时文件。

咳咳,老哥看起来说的没毛病,但是它这个实现确实没有考虑到大量的目录会撑爆 inode 的情况!

然后有个叫 RekaDowney 的老哥也在下面说到:

图片

不论请求的 content-type 是不是 multipart/form-data 都会创建临时目录(这跟我前面说的一样,我这几天的几百万请求压根不是 multipart 相关的)。

然后 poutsma 老哥觉得没啥毛病:

图片

你不用 multipart 创建这个目录也没影响,这目录里面又不会有文件,一个目录才占几 bytes,洒洒水啦。

额,把我洒哭了(3分钟线上服务不可用这是P几事故?)

图片

不过后面马上 poutsma 老哥意识到这样好像也不好,因此他回复到:

图片

对,他稍微妥协了下:我改我改,目录只在解析 multipart 数据的才会创建。

一天后 RekaDowney 老哥已经等不及了,他说:我已经算不清到底创建了多少个目录了,至少有 200 多w,然后我修改了源码,就调整了几行,只有在解析 multipart 的时候才创建,并且老哥还说要不要他提个 pr 贡献一波代码!

图片

这位 RekaDowney 老哥的执行力还是强啊,自己动手丰衣足食,毕竟鬼知道这修复啥时候能发版。

好了,吃瓜暂时吃到这,最终我跟踪看到这个玩意是在 5.2.16 版本修复:

图片

具体的替换方式是不无脑创建了,就创建一个随机的目录,然后保存这个引用,这样即使有很多 multipart 的请求,也不会创建很多目录了,整挺好:

图片

图片

然后我翻阅了一下 5.2.16 那个版本的 release,咳咳:

图片

上面写着这玩意是 feat,不是 bug。你们觉得呢?

程序员的倔强之,这不是bug:)

最终我的解决方案是:升级了 Gateway 的版本到 5.2.16。

Qwen3.6-Plus实战:8分钟生成可上线地铁查询官网 大语言模型正从‘对话工具’演进为‘工程协作者’,其核心在于工具调用闭环、超长上下文理解与多模态意图识别能力。Qwen3.6-plus 通过深度集成搜索、文件生成、代码编写与打包等工具链,支持将模糊需求(如一张截图或一段PRD)直接转化为可部署的HTML静态站;百万级上下文使其能跨PDF、设计稿、聊天记录等异构信息源建立统一语义认知,显著降低上下文切换损耗;结合多模态输入,进一步压缩‘描述意图’到‘交付结果’的表达成本。本文以北京地铁1号线查询官网为案例,详解如何在真实工作流中落地该能力,覆盖提示词设计、工具 阅读详情

相关推荐

什么?知乎又挂了?我们来聊聊微服务的高可用如何保障

故事 今天中午知乎又一次宕机,访问返回502错误,如下图所示: 高可用标准 那服务既然挂了,我们来聊聊如何在微服务中如何保障他能够不挂呢?首先我们来看看业界的高可用标准,一般常见的概括如下: 5个9的SLA在一年内只能是5分钟的不可用时间,5分钟啊,如果按一年只出1次故障,你也得在五分钟内恢复故障,感觉还是有点厉害。 什么是高可用? 那我们在做高可用之前,先通过维基百科了解一下到底什么是真正的...

SpringForAll的博客 770

spring cloud gateway 网关服务 以及与zipkin , config 集成

上面的config应用,zipkin应用都已经注册到eureka上面,但是他们与具体的应用如何集成呢? 详情请看如下配置: bootstrap.yml xxh: eureka: node1: 192.16.50.76 node2: 192.16.50.77 node3: 192.16.50.78 port: 8886 gateway: node1: xxhl...

qq_19550657的博客 2745

springcloud gateway

spingcloud gateway简单实例源码,spring-cloud-gateway-sample

java spring上传文件大小_java - Spring WebFlux:设置用于上传文件的最大文件大小 - SO中文参考 - www.soinside.com...

对于写入磁盘的文件部件,还有一个额外的maxDiskUsagePerPart属性可限制每个部件的磁盘空间量。还有一个maxParts属性,用于限制多部分请求中的部分总数。要在WebFlux中配置所有3个,您需要向ServerCodecConfigurer提供一个预配置的MultipartHttpMessageReader实例。我能够通过此配置类应用它:@Configuration@EnableWe...

weixin_35651191的博客 733

SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现

在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况。这篇文章主要介绍了SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现,感兴趣的小伙伴们可以参考一下

金融领域强化学习在多资产类别动态交易执行中的应用

在金融市场中,多资产类别的交易执行面临着诸多挑战,如市场的不确定性、资产间的复杂相关性等。传统的交易策略往往难以适应动态变化的市场环境。本研究的目的在于探索如何运用强化学习技术,实现多资产类别在动态市场环境下的高效交易执行。具体范围涵盖了从强化学习的基本原理到在多资产交易场景中的实际应用,包括核心算法的实现、数学模型的构建以及项目实战等方面。本文首先介绍研究背景,包括目的、预期读者和文档结构。接着阐述核心概念,包括强化学习和多资产类别动态交易执行的原理及其联系。

AI 领航者的博客 631

Linux中使用systemd挂载文件系统

 Systemd为Linux管理员提供处理挂载和自动挂载文件系统的新方式。如果你习惯/etc/fstab以及autofs挂载文件,现在也许要学一些新的方法。 在RHEL7和其他Linux 版本中引进的Linux systemd,不仅可以关闭与开启服务,在安装好RHEL7服务器之后,你也许会对/etc/fstab这个目录感兴趣,这个文件用于管理整个文件系统挂载,刚安装时它几乎是空的,在文件中

wangmj518的专栏 4923

避坑指南:Spring3集成OpenAPI时泛型响应失效的3种解决方案

本文深入探讨了Spring3集成OpenAPI时泛型响应失效的问题,提供了三种实用解决方案:移除@Schema注解、使用@ArraySchema包装泛型以及自定义Schema处理器。针对不同项目规模,详细分析了各方案的适用场景、优缺点及性能影响,帮助开发者高效生成准确的接口文档,提升前后端协作效率。

weixin_30839881的博客 100

使用SpringCloud Gateway遇到的一些问题

记录使用SCG过程中遇到的问题

罗小爬的技术宝书 4525

菜鸟-需求预测与分仓规划

通过修改模型的损失函数对问题进行求解,比其它单模型的效果好很多。

永不理解_fdu的博客 4882

BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。 又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料: 1.力士乐控制器RC6系列介绍 2.力士乐控制器手册不完整版 3.RC6-9程序下载 力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。 For these controllers, in the event of an...

我的技术日常 6496

从一次线上Bug复盘说起:乱用@RequestBody接收表单数据,我的服务差点挂了

本文通过一次线上Bug复盘,详细分析了错误使用@RequestBody接收表单数据导致的性能问题。文章深入解析了SpringMVC的绑定机制,对比了@RequestParam和@RequestBody的使用场景,并提供了正确的解决方案和性能优化建议,帮助开发者避免类似问题。

weixin_42556197的博客 246

sophgo sdk v23.03.01

C/C++程序建议在x86主机上使用交叉编译工具链编译生成可执行文件后,再拷贝到SoC目标平台运行。# 创建docker用户组,若已有docker组会报错,没关系可忽略。对于SoC模式,模型转换也需要在docker开发容器中完成;docker开发容器的配置参照前述章节相关内容。6、创建docker容器并进入Docker。# docker命令免root权限执行。# 将当前用户加入docker组。# 重启docker服务。# 安装 docker。3、安装docker。7、SoC 环境配置。

weixin_40723768的博客 915

线上Java服务凌晨3点告警,我靠这张排查流程图5分钟解决了故障

做Java后端开发的同学,大概率都经历过凌晨线上告警轰炸的绝望:手机钉钉、短信、电话轮番震动,睡眼惺忪打开监控面板,映入眼帘的是一片红通通的告警色块、飙升的CPU、堆积的线程、超时的接口。

小筱在线博客 471

OneNet新版MQTT+OneJSON接入全指南

物联网云平台设备接入是嵌入式系统与云端协同的基础能力,其核心依赖于标准化通信协议与统一数据模型。MQTT作为轻量级发布/订阅协议,凭借低带宽占用和高可靠性,成为边缘设备上云的主流选择;而物模型(Thing Model)则定义了设备能力的数字契约,支撑数据语义化与平台自治管理。OneNet新版强制采用MQTT+OneJSON协议栈,不仅提升数据解析一致性与安全认证强度,更推动开发范式从‘协议适配’转向‘模型驱动’。该架构广泛适用于环境监测、智能表计、工业传感等场景,尤其利好基于ESP8266、STM32等资源

weixin_42599558的博客 362

危废焚烧优化控制系统设计与实现:基于数据驱动的控制参数预测

本文提出了一种基于数据驱动的危险废物焚烧过程优化控制方法。系统利用历史运行数据和实时监测数据,通过深度学习模型预测关键控制参数,实现焚烧过程的智能化控制。系统采用Python开发,结合TensorFlow/PyTorch框架,构建了完整的数据采集、预处理、特征工程、模型训练和实时预测闭环系统。该系统能够处理多变量非线性关系,适应工况变化,从历史数据中学习最优控制策略,相比传统PID控制方法具有显著优势。论文详细介绍了系统架构、算法设计和实现细节,为危废焚烧过程的优化控制提供了有效解决方案。

huanghm88的专栏 207

从崩溃到稳定,线上Bug应急处理全流程,每个开发者都该掌握

auto-generated

codeink的博客 1004

车载以太网网络测试-27【SOME/IP-SD简述】

SOME/IP-SD协议是基于IP的可扩展面向服务中间件中的服务发现协议,是汽车电子和嵌入式系统中实现动态服务发现与通信的核心组件。该协议规范详细说明了协议SOME/IP服务发现(SOME/IP-SD)的格式、消息序列和语义。本文将对SOME/IP-SD协议进行详细介绍。

车载网络测试工程师的博客 1957

MIMO Pro V2 + Qwen 3.6 Plus双模协同修Bug实战

AI编程辅助已从‘代码生成’迈入‘缺陷诊疗’新阶段:基于代码理解与系统分析的双重能力,实现对事务不一致、分布式死锁等典型后端故障的精准定位与根因穿透。MIMO Pro V2 专注代码级手术刀式定位,强于上下文感知与事务语义识别;Qwen 3.6 Plus 擅长系统级因果推演,融合Spring生态、Redisson、MyBatis等国内主流技术栈深度知识。二者协同构建‘定位-归因-修复-沉淀’完整Debug闭环,显著提升Java/Go/Python后端在Spring Boot、微服务、分布式场景下的问题响应效

ozzzzzz的专栏 554

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Swift 正则字面量(SE-0354)完全指南:`/.../` 与 `/.../` 的语法、类型推断与解析规则

本指南以 Swift Evolution 提案 [SE-0354 Regex Literals](https://link.gitcode.com/i/a42d5abb738e799f06bbf9ff2fb84a3b) 为核心,系统讲解 Swift 5.7 起引入的正则字面量语法:如何用 `/.../` 与扩展定界符 `#/.../#` 在编译期构造 `Regex`,如何通过捕获组自动推断强类型输

gitblog_01044的博客 331

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BUG与测试用例

定义:一个计算机bug指在计算机程序中的一个错误、缺陷、疏忽或故障,这些bug使程序使无法正确的运行。Bug产生于程序的源代码或程序设计阶段的疏忽或者错误那么回归到软件测试中呢,bug可以更加准确来说:1.当且仅当需求规格说明书是存在的并且正确,程序与规格说明之间的不匹配才是错误2.当需求规格说明书没有提到的功能,判断标准以最终用户为准,当程序没有实现其最终用户合理预期的功能要求时,就是软件错误如何描述一个Bug以下是一个基础骨架要素说明示例1. 出现的版本(Version)

m0_75169015的博客 1413

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

10 分钟免费完成游戏 DLSS 版本替换:DLSS Swapper 全流程实操

新版 DLSS 公开已久,你装的游戏却还停在旧版本上。DLSS Swapper 是一个免费开源工具:它帮你自动定位游戏里的 DLSS 文件,下载新版本,替换前先把原文件备份好,你不用再翻目录。 [![DLSS Swapper 游戏库主界面,展示每款游戏当前的 DLSS 版本号](https://raw.gitcode.com/GitHub_Trending/dl/dlss-swapper/raw

gitblog_00557的博客 905

Steam挂刀行情站:从手工比价到智能监控,3步搭建你的专业饰品交易系统

在Steam饰品交易的世界里,你是否曾因手动比价而错失良机?是否曾因信息滞后而蒙受损失?今天,我要为你介绍一款能够彻底改变你交易方式的专业工具——**Steam挂刀行情站**。这款开源工具不仅能帮你24小时不间断监控BUFF、IGXE、C5、UUYP四大平台的挂刀比例数据,更能通过智能算法为你发现最佳套利机会。 ## 🎯 痛点分析:传统交易模式的三大困境 ### 信息不对称:手工比价的效率瓶

gitblog_00232的博客 927

即时通讯软件线上系统维护工作总结

原文:即时通讯软件线上系统维护工作总结 作为专业的即时通讯开发商,NanShan即时通讯软件的主要负责人目前在一家网站公司工作,2015年初研发中心部门改革,小组重组,被分配到了网站平台的维护组。下面内容是对近期维护工作的一个总结: 个人感受:以前也在老东家的团队也做线上系统的维护和新产品的研发,由于大家的认真负责,Leader的管理也很到位,线上的系统很少有bug反馈,不管是UI上迭代,

小发猫 1379
上一篇: 安卓版ChatGPT要来了!
下一篇: 从C++98到C++26,经历了什么?
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值