大文件上传怎么设计?分片上传、断点续传和秒传有什么区别?
分片上传是把大文件拆成多个部分分别传输,便于控制单次失败成本和并发。服务端需要用上传会话、分片序号与校验信息组织它们,最后完成合并或对象存储提交。断点续传是在中断以后,根据服务端确认的已完成分片继续传缺失部分。
网络协议、操作系统、进程线程、内存、数据结构与算法,关注不依赖具体框架的基础机制。
共 3 篇文章
分片上传是把大文件拆成多个部分分别传输,便于控制单次失败成本和并发。服务端需要用上传会话、分片序号与校验信息组织它们,最后完成合并或对象存储提交。断点续传是在中断以后,根据服务端确认的已完成分片继续传缺失部分。
秒杀首先需要保护系统容量。静态资源尽量提前分发,入口做身份校验、重复请求限制与限流,不让所有请求直接进入库存和数据库。库存检查与预占必须在定义好的范围内原子完成,同时记录请求或预占 ID,避免重复请求反复扣减。
消息是否可靠,需要分别检查业务到生产者、生产者到 Broker、Broker 存储与复制,以及消费者处理这几段。生产者要处理发送失败和确认不确定,Broker 要按产品机制配置持久化、复制与故障恢复。
redo log 是 InnoDB 的重做日志,支持在数据页尚未全部落盘时恢复相关修改。它不是 SQL 历史记录。undo log 保存回滚所需的记录,也参与构造一致性读所需要的旧版本。事务提交以后,不代表这些记录马上就可以全部清掉。
XSS 是不可信输入被页面当作可执行内容,攻击者因此获得当前页面里的脚本能力。主要防护是按输出上下文正确编码,富文本使用可靠净化,并避免危险的动态执行入口,CSP 可作为额外防线。
闭包是函数与它所处词法环境的组合,使函数能够访问定义位置外层的变量。外层函数返回以后,只要相关函数及环境仍然可达,需要的变量就可能继续存在。闭包不是把当时所有变量都拍成一份快照。多个函数可以共享同一个变量,读取时看到后续修改;
Vue 3 的 reactive 为对象创建响应式代理。依赖执行时读取属性,系统记录这段逻辑依赖哪个属性;属性改变后,再通知相关依赖更新。Proxy 负责拦截操作,依赖收集和触发机制负责建立对应关系。
useEffect 用来让组件与外部系统保持同步,比如建立连接、订阅事件或管理浏览器资源,不是把所有渲染后的逻辑都装进去。组件提交后,React 根据依赖决定是否运行 Effect。
同源通常要求协议、主机与端口相同。不同来源之间,浏览器按同源策略和 CORS 规则处理。有些请求可以直接发,但响应需要服务端许可,页面脚本才能读取;另一些先发 OPTIONS 预检,询问来源、方法与请求头是否允许,再发正式请求。
Session 方案通常在服务端保存会话状态,浏览器携带会话标识,服务端查到有效记录以后才接受身份。JWT 是一种 Token 格式。常见签名 JWT 携带声明,服务端验证签名、过期时间、签发方和目标接收方等条件后才能接受。
强缓存是浏览器在缓存仍然新鲜时,直接复用已有响应,不需要为了这个资源向服务器验证。常用 Cache-Control: max-age 指定新鲜期。协商缓存是在需要验证时,带着资源标识询问服务器。
浏览器中的 JavaScript,通常先执行当前任务里的同步代码。当前调用栈清空后,会在微任务检查点处理排队的微任务,随后浏览器才有机会渲染、选择下一项任务。Promise 的后续回调和 await 后面的继续执行,通常进入微任务队列;
Redis 快,是多个因素共同作用。常见数据操作主要访问内存,键查找和不同数据类型采用相应结构,网络事件处理也避免为每个连接都创建一个执行线程。“单线程”通常指常见命令的主要执行路径由主线程串行处理,不是说整个进程没有其他线程或子进程。
RDB 保存某个时点的数据快照,文件较紧凑,恢复时直接加载快照,但快照完成以后发生的写入,单靠这份 RDB 无法找回。AOF 记录用于重建数据的写入操作。
HTTP 定义请求和响应的语义,HTTPS 通常指通过 TLS 保护的 HTTP 通信。HTTP/3 使用 QUIC,而 QUIC 也集成了 TLS 1.3 的安全机制。TLS 主要处理保密性、完整性和身份验证。
TCP 三次握手的核心,是同步双方初始序号,并确认各自发送的 SYN 已经被对方收到。客户端先发 SYN,服务端用 SYN 加 ACK 既确认客户端,又提出自己的序号,客户端再发 ACK 确认服务端。
进程是操作系统中的资源与隔离单位,通常有独立地址空间;同一进程里的线程共享很多资源,各自有执行状态,可以由操作系统调度。协程则通常由语言运行时或库安排。
所谓索引失效,实际要分清两种情况:查询条件无法利用索引有效定位,以及索引可用,但优化器没有选择它。例如,对索引列做函数处理、发生某些隐式转换,或者字符串查询以通配符开头,可能无法按原索引缩小范围。
MVCC 是多版本并发控制。InnoDB 为记录保留版本信息,并通过 undo 记录回溯旧版本,让普通一致性读能够读取符合自己快照的数据,而不必总等待其他事务的写锁。Read View 是判断版本是否可见的读取视图。
Redis 分布式锁常见的基础做法,是用一条 SET 命令同时完成“不存在才设置”和“设置有效期”。锁值使用本次申请的唯一标识,释放时只有值仍属于自己,才原子删除。但这只是有租期的互斥。锁过期以后,原来的程序不会自动停止;
这里通常讨论的是 InnoDB 的常见索引,不能把所有 MySQL 索引都说成同一种结构。B+ 树内部节点主要保存键和指向下一层的指针,一个页能容纳较多分支,因此树通常较矮。
缓存穿透、击穿和雪崩,都可能让请求大量访问数据库,但触发原因不同。穿透通常是反复查询本来就不存在的数据,缓存和数据库都没有结果。可以做参数检查、短期空值缓存,必要时用布隆过滤器提前筛选。击穿是某个热点缓存失效以后,大量请求同时回源。
微信搜一搜「程序员Sunday」,或扫码关注
新文章第一时间推送;站点文章需要解锁时,在公众号里回复「验证码」即可领取链接。
