加载中...

singleflight 指「同一时刻对同一个键的多个并发请求只真正执行一次,其余请求等待并共享该次结果」的合并机制。名称源自 Go 官方扩展库 golang.org/x/sync/singleflight,概念本身在各语言中通用,也称请求合并(request coalescing)或防惊群。
实现上用一个以键索引的「进行中调用表」:第一个请求登记后执行真实函数(查库、调下游接口),后续同键请求发现已有 in-flight 调用便阻塞等待;调用完成后结果广播给所有等待者并清除登记。Go 版本提供 Do、DoChan 及防止错误结果被共享的 Forget 方法。
最典型的场景是缓存击穿:热点键过期瞬间,成百上千并发请求同时未命中,若全部回源会压垮数据库;加上 singleflight 后只有一个请求回源重建缓存。CDN 与反向代理中的对应机制(如 Nginx 的 proxy_cache_lock)思想相同。
需处理执行者失败的错误扩散、等待超时,以及避免把不同用户的敏感结果错误共享。

登录 后参与讨论
暂无讨论,来发表第一条评论吧