io_uring如何让Linux I/O性能翻倍:从环形缓冲区到零拷贝的技术革命

2019年5月,Linux 5.1内核合并了一个名为io_uring的新子系统。三年后,这项技术已经成为高性能数据库、存储引擎和网络服务的标配。从Redis到PostgreSQL,从Nginx到Envoy,越来越多的系统开始迁移到这个新接口。 ...

18 min · 8651 words

Web Locks API:浏览器如何让多标签页优雅地协调资源

多标签页的协调困境 现代 Web 应用越来越复杂,用户经常在多个标签页中打开同一个应用。一个在线文档编辑器可能被同时打开在三个标签页里;一个股票交易网站可能同时运行在多个窗口中。这些场景都面临同一个问题:如何让多个独立的 JavaScript 执行上下文协调工作? ...

12 min · 5579 words

HTTP/3的流量控制为何比TCP更精细:从滑动窗口到双层限额机制的技术演进

2016年,Cloudflare在部署HTTP/2时遇到了一个奇怪的问题:某个高优先级的大文件传输会阻塞所有其他请求,尽管HTTP/2已经实现了多路复用。问题的根源在于TCP的流量控制机制——所有流共享同一个滑动窗口,一个流的丢包会让整个连接停摆。 ...

12 min · 5713 words

浏览器扩展的隐形权力:为何第三方代码能读取你的每一次点击

浏览器扩展已经成为现代网络生活中不可或缺的工具。广告拦截、密码管理、翻译辅助、开发者工具——这些小小的插件极大地提升了我们的工作效率。但你是否想过,当你安装一个浏览器扩展时,你实际上给了它什么权力? ...

14 min · 6572 words
Blog Cover

原型链查找一次属性需要遍历多少对象:从 JavaScript 设计哲学到 V8 引擎优化

1995 年 5 月,Brendan Eich 在网景公司的十天内完成了 JavaScript 的设计与实现。他面临一个关键决策:采用传统的类继承模型,还是更灵活的原型继承模型?最终,他选择了后者——受 Self 语言启发的原型继承机制。这个决定深刻影响了此后三十年 JavaScript 的演进轨迹。 ...

9 min · 4299 words
Blog Cover

实时游戏的网络同步困境:从帧同步到状态同步的技术抉择

1996年,当John Carmack设计Quake的网络架构时,他面临一个看似不可能的挑战:如何在拨号上网时代(平均延迟200-300毫秒),让玩家获得接近本地游戏的流畅体验?这个问题的答案,最终塑造了接下来三十年实时网络游戏的技术演进路径。 ...

12 min · 5957 words

事件驱动架构为何让开发者又爱又恨:从事件溯源到CQRS的十五年技术博弈

2011年,一位名叫Greg Young的开发者在一次技术会议上提出了一个看似简单的想法:如果我们不再存储对象的当前状态,而是存储导致状态变化的所有事件,会怎样?这个想法后来被称为事件溯源(Event Sourcing)。十五年后的今天,事件驱动架构已经成为微服务系统的核心范式,但它的复杂性也让无数开发者痛不欲生。 ...

13 min · 6443 words