问题排查:上传成功的文件丢失了?

问题描述

在我负责的项目中,点击下载两个上传成功的附件,服务端却返回异常"文件不存在"。

问题排查

文件上传和下载

我们系统中的文件都是存储在 Google Cloud Storage(GCS) 的,文件上传逻辑如下:

1、web 端向服务端申请上传 url

2、server 端在本地 DB 新增一条数据记录

3、server 端生成一个用于上传文件的预签名的 url

4、server 端返回 url 给 web 端

5、web 端使用 url 上传文件到 GCS

6、web 端调用 server 端接口,表示完成上传

7、server 端更新数据记录的状态为 success

文件下载逻辑如下:

1、web 端调用 server 端接口,传入本地文件 ID

2、server 从 DB 中找到数据记录

3、server 生成下载 url 返回给 web

4、web 端点击 url,从 GCS 下载文件

排查步骤

1、查看用户下载异常的数据,发现数据记录的状态是 succes,说明前端调用了"上传-步骤 7"。

2、因为前一段时间,我们刚把存储服务从 AWS S3 迁移到 GCS,所以怀疑是数据迁移不完全;

  • 使用原本 AWS S3 的配置生成 url,依然不能下载;
  • 查看迁移时间,是在文件上传时间之前,排除了迁移不完全的原因。

3、在测试环境操作,发现前端的代码正常,文件上传后能正常下载。

4、查看线上当天的其他文件数据,以及前后几天的数据,都能正常下载。

我们初步认为:不是我们系统的问题,是 GCS 那边出现异常导致的。

5、找 GCS 的同事帮忙排查:

  • 我们找到了该文件"上传-步骤 7"接口调用时间
  • GCS 同事根据时间查找前后一段时间内的请求记录,发现没有上传记录
  • 但是能查到当天其他文件的数据

6、对比 GCS 和我们系统本地的数据,执行命令:

shell 复制代码
gcloud storage ls --recursive gs://BUCKET_NAME/**

查看 gcs 的所有文件的 key,和我们本地数据库对比,的确没有异常的数据。

也就是说,在上传步骤中,前端没有成功执行"上传-步骤 5",却成功执行了"上传-步骤7";目前测试环境又是没问题的,唯一的可能是前端自己修复了这个问题。

问题定位

我们查看上线记录,在异常数据的上传时间 ~ 今天 之间,前端重构上传文件部分的代码。

比较重构前后的前端代码,发现在重构之前,前端的上传操作步骤如下:

TEXT 复制代码
1、web 端向服务端申请上传 url

...

6、web 端调用 server 端接口,表示完成上传

5、web 端使用 url 上传文件到 GCS

前端颠倒了 上传到 GCS 和 完成上传的顺序,导致数据记录状态是 SUCCESS 上传却是失败的。

总结

1、 先从服务端和存储端排查问题,如果服务端和存储端都没问题,无法定位的时候,只能自己把所有所有步骤和所有环节(前端后)都检查一遍;

2、项目一定要有上线记录,对排查这种"某个时间点前后表现不一致"的问题很有帮助。

相关推荐
小北方城市网35 分钟前
MySQL 索引优化实战:从慢查询到高性能
数据库·spring boot·后端·mysql·rabbitmq·mybatis·java-rabbitmq
汤姆yu1 小时前
基于springboot的植物花卉销售管理系统
java·spring boot·后端
海南java第二人1 小时前
Spring Boot Starters深度解析:简化依赖管理的核心利器
java·spring boot·后端
韩立学长1 小时前
Springboot喵趣网上宠物店的设计和实现5pidz60b(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
J_liaty2 小时前
Redis公共方法详解
spring boot·redis·后端
小北方城市网2 小时前
生产级 Spring Boot + MyBatis 核心配置模板
java·spring boot·redis·后端·spring·性能优化·mybatis
a努力。3 小时前
蚂蚁Java面试被问:流批一体架构的实现和状态管理
java·后端·websocket·spring·面试·职场和发展·架构
计算机学姐3 小时前
基于SpringBoot的在线骑行网站系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
BlockChain8883 小时前
Spring框架终极入门指南(12000字深度解析)
java·后端·python·spring
学嵌入式的小杨同学3 小时前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring