时间轮如何以O(1)复杂度处理百万级延迟任务

一个电商平台在双十一期间需要处理数百万个订单超时取消任务。每个订单创建后30分钟未支付就需要自动取消,释放库存。最直观的实现方式是在数据库中存储订单的创建时间,然后启动一个定时任务每隔几秒扫描一次,找出所有超时的订单。 ...

11 min · 5472 words

消息队列的投递语义为何如此复杂:从「精确一次」的不可能到「有效一次」的工程实践

2019年,某支付平台因消息重复处理导致同一笔订单被扣款两次。工程师排查后发现,消费者在处理完消息后、发送确认前崩溃,消息队列在超时后重新投递,而业务代码没有实现幂等性。这不是个例——在分布式系统中,消息的重复投递几乎是不可避免的。 ...

12 min · 5898 words

消息队列的顺序性为何如此难以保证——从分区策略到消费者并发的完整技术解析

一个电商平台的订单系统收到两条消息:先是"订单已付款",紧接着是"订单已发货"。但消费者处理时,先处理了"已发货",再处理"已付款"。数据库里的订单状态变成了一个诡异的组合——用户明明已经付款,系统却显示发货在付款之前。 ...

10 min · 4707 words

幂等性设计:为何一个请求被重复执行会产生数据灾难

2017年2月,一位开发者在Stripe官方博客下留言:他刚刚经历了一次"幽灵扣款"——用户点击支付按钮后页面超时,刷新重试,结果被扣了两次款。这不是技术故障,而是系统设计缺陷。在网络不可靠的世界里,重试是常态;如果没有幂等性设计,每一次重试都可能成为数据灾难的开始。 ...

9 min · 4020 words

零拷贝:让数据"走捷径"的三十年技术演进

1995年,一名程序员在测试文件服务器时发现了一个令人困惑的现象:服务器CPU利用率高达80%,但实际的数据传输速度却远低于硬件理论带宽。追踪后发现,超过60%的CPU时间花在了同一个操作上——memcpy()。 ...

10 min · 4550 words