评估容量首先要收集关键指标:并发上传请求峰值(QPS)、单个文件平均大小(或分片大小)、平均上传时延以及保留窗口(例如临时缓存或回源带宽占用时长)。常用公式为:并发 = 吞吐量(req/s)× 平均处理时延(s)(Little's Law),带宽需求 = 峰值QPS × 平均文件大小。再叠加冗余系数(1.2~1.5)和突发允许量,得到存储、出入带宽和回源带宽的容量规划。
Java后端要从线程池、I/O模型和连接池三方面设计。优先使用非阻塞I/O或异步Servlet/Netty,减少每个上传连接占用的线程;线程池大小可通过目标吞吐量与平均处理延迟反推(并发 ≈ 吞吐量×延迟),避免线程过多导致上下文切换。连接池与NIO缓冲应按带宽和内存限制配置,并使用限流中间件(如Guava RateLimiter、Bucket4j)控制入站并发。
必须在客户端与边缘同时做限流与回压:客户端限速(分片上传、带宽自适应、重试退避)能减少后端突发流量;边缘(网关、边缘缓存、CDN接入层)应返回明确的429/Retry-After并推送回压策略。常见做法是预签名上传至CDN/OSS,把大量数据直接流量导向CDN以减少回源压力,同时在边缘做速率限制和并发控制,保护后端。
分布式限流通常使用集中式计数(Redis、etcd)或分布式令牌桶(Token Bucket)实现。推荐方案包括:1) 使用Redis的原子计数+TTL实现滑动窗口或固定窗口限制;2) Bucket4j结合Redis或Hazelcast做分布式令牌桶;3) 使用API网关(Kong、Envoy)做统一入口限流;4) 按用户ID、API Key、IP做分层限流策略。为保证公平,可配置全局配额与每用户最小保障,同时支持动态权重与熔断。
超载处理要分三步:检测、保护、恢复。检测使用指标(QPS、错误率、95/99分位延迟、回源带宽占用)和报警;保护层使用熔断(Resilience4j)、整体或分用户限流、优先级队列和拒绝策略(429、503),同时支持按来源或业务降级(限制分辨率、禁止并行转码)。恢复阶段用渐进放量和自动伸缩策略。监控方面需搭建端到端链路(Prometheus/Grafana、ELK),对上游CDN接入、回源流量、后端写入TPS和磁盘/网络IO做实时可视化。
