
1) 【一句话结论】
针对百万级用户高并发视频上传场景,系统采用分布式限流、分片+断点续传、对象存储(如阿里云OSS)+负载均衡的架构,通过多维度技术优化,保障高可用、高并发、高可靠的上传能力,核心是通过分片降低单次请求负载,断点续传提升用户体验,限流避免系统过载,负载均衡实现请求分发。
2) 【原理/概念讲解】
upload_id的已上传分片数)。upload_id+已上传分片数),服务器通过Redis或数据库持久化进度。若上传中断,下次从断点继续。冲突处理:若客户端标记的进度与服务器记录不一致(如客户端崩溃后重置标记),服务器通过任务ID查询最新进度,避免重复上传。例如,客户端标记已上传3个分片,服务器记录为2个,则从第3个分片开始上传。3) 【对比与适用场景】
| 特性 | 分片上传(大文件) | 单文件上传(小文件) |
|---|---|---|
| 定义 | 文件拆分为多个分片上传 | 直接上传完整文件 |
| 特性 | 支持断点续传、分片校验 | 简单,无断点续传支持 |
| 使用场景 | 视频、图片等大文件(>10MB) | 头像、文档等小文件(<5MB) |
| 注意点 | 需处理分片顺序、完整性校验 | 无 |
4) 【示例】(分片上传请求示例,伪代码)
客户端将文件分片,每个分片包含:
{
"upload_id": "task_20240101_001", // 上传任务唯一ID(由客户端生成,全局唯一)
"chunk_index": 0, // 分片索引(从0开始,表示第几个分片)
"chunk_size": 4 * 1024 * 1024, // 分片大小(4MB,工程中通常为1-5MB)
"total_chunks": 8, // 总分片数(文件总大小/分片大小,向上取整)
"file_name": "video.mp4", // 文件名
"content_type": "video/mp4", // 内容类型
"md5": "d41d8cd98f00b204e9800998ecf8427e", // 分片MD5校验值(客户端计算后发送)
"progress": 0 // 已上传分片数(客户端标记的进度,用于断点续传)
}
服务器接收分片后,处理流程:
upload_id是否有效(数据库中存在该任务)。md5比对,若不一致则丢弃并返回错误。/uploads/{upload_id}/{chunk_index})。upload_id记录,增加已上传分片数(如从0变为1)。5) 【面试口播版答案】
面试官您好,针对百万级用户高并发视频上传,我设计的系统核心是分布式架构,通过限流控制请求速率,分片上传+断点续传处理大文件,对象存储(如阿里云OSS)存储文件,负载均衡分发请求。具体来说,限流采用令牌桶算法,按用户粒度限流(时间窗口1秒,每用户每秒10个令牌),避免全局限流影响正常用户。分片上传将文件切分成4MB的小块,每个分片包含任务ID、索引、MD5校验值,服务器校验后存储,断点续传通过Redis记录客户端标记的进度(如upload_id+已上传数),下次从断点继续。对象存储启用版本控制,文件覆盖时保留旧版本。负载均衡器通过上传任务ID关联会话(将任务ID存入Redis),确保会话中断后进度可恢复。这样能应对百万级并发,保证上传成功率。
6) 【追问清单】
upload_id->已上传分片数),确保服务器重启后进度不丢失,客户端标记与服务器记录不一致时,服务器通过任务ID查询最新进度。7) 【常见坑/雷区】