2013年Facebook日均处理超过10万亿次缓存请求的壮举,在《Scaling Memcache》论文中揭开了现代缓存系统的神秘面纱。本文将结合量化金融场景,解析如何借鉴Facebook的工程智慧构建金融级缓存体系。
在实时风控系统中,我们曾记录到:
// 典型危险实现
func GetOrder(id string) (*Order, error) {
val, err := redis.Get(id).Bytes()
if err == redis.Nil {
// 直接穿透查询数据库
return db.Query("SELECT * FROM orders WHERE id=?", id)
}
return deserialize(val)
}
这种实现存在多个严重问题,导致某高频交易平台在流量高峰时数据库连接池耗尽:
从Facebook的经验和Go语言的并发特性来看,金融级缓存系统应至少包含以下防御机制: