数据库已提交的事务为何会丢失?从fsync到异步提交的持久性权衡

数据库教科书告诉开发者一个简单的承诺:事务一旦提交,数据就是持久的。ACID中的"D"代表Durability——持久性。但生产环境中的实际情况远比教科书复杂:同样配置了主从复制、同样使用了SSD存储、同样收到了COMMIT成功的返回码,断电重启后,有些数据确实完好无损,有些却凭空消失了。 ...

13 min · 6186 words

事件溯源 vs CRUD:为什么90%的系统都不需要这个复杂的架构

2016年,一个初创团队决定采用事件溯源架构来构建他们的电商系统。两年后,当被问及这个决策时,技术负责人的回答让人深思:“如果你问我是否后悔选择事件溯源,我的回答是:不后悔。但如果让我重新选择,我会先用CRUD。” ...

10 min · 4594 words

API 版本控制没有万能方案:为何每家公司都在用自己的方式处理破坏性变更

2017年8月,Stripe 发布了一篇博客文章,详细阐述了他们如何通过「日期滚动版本」策略,在六年时间里完成了近百次向后不兼容的升级,同时保持与每个版本的完全兼容。这篇名为《APIs as infrastructure: future-proofing Stripe with versioning》的文章,至今仍被视为 API 版本控制的标杆实践。 ...

10 min · 4710 words

数据流太快会撑爆内存?背压机制为何是异步系统的安全阀

2015年,一家电商平台在促销活动中遭遇了一场诡异的生产事故。订单服务正常运行,CPU占用率不到30%,内存却以每秒数百兆的速度增长,最终触发了OOM Killer。运维团队排查了三天,才在日志里发现一条不起眼的错误信息:MissingBackpressureException。 ...

12 min · 5514 words

时序数据库如何用1.37字节存储一个数据点:从压缩算法到存储引擎的十五年演进

2015年,Facebook的监控团队面临一个看似无解的问题:每秒产生700万个数据点,如果按照传统方式存储,仅内存就需要16TB。这个数字意味着任何规模的集群都无法在经济上承受。但他们最终找到了答案——通过一种称为Gorilla的压缩算法,将每个数据点从16字节压缩到平均1.37字节,压缩比达到12倍。 ...

11 min · 5296 words

事务隔离级别为何成为数据库最被误解的概念

医院值班系统中,两位医生同时尝试放弃自己的值班班次。每个医生在操作前都会检查:是否至少还有另一位医生在值班?检查结果都显示"是",于是两人都放心地提交了更新。最终结果:当晚没有任何医生值班。 ...

10 min · 4538 words

连接池耗尽:为什么你的数据库连接池总是成为生产事故的元凶

2025年11月,某电商平台在“双十一”与“黑色星期五”促销期间遭遇了一场灾难:API响应时间从200ms飙升到45秒,每小时的营收损失达到89万美元。事后复盘发现,罪魁祸首是一个配置错误的数据库连接池——最大连接数被设置为10,而数据库服务器完全可以处理500个并发连接。 ...

13 min · 6450 words