singleflight简单介绍
singlefight直译“单飞”,那顾名思义就是有一堆鸟,但是咱只让一只鸟单飞。。。😄
singleflight
提供了重复函数调用抑制机制,使用它可以避免同时进行相同的函数调用。第一个调用未完成时后续的重复调用会等待,当第一个调用完成时则会与它们分享结果,这样以来虽然只执行了一次函数调用但是所有调用都拿到了最终的调用结果。
singleflight使用场景
singleflight设计模式能够有效减轻对数据库的压力。
singleflight:在有多个goroutine试图去数据库加载同一个 key对应数据的时候,只允许一个goroutine过去查询,其它都在原地等待结果。
对数据库的压力本来是跟QPS相当,变为跟同一时刻不同key的数量和实例数量相当。例如同一个时刻需要加载十个不同key 的数据,应用部署了三个实例,那么对数据库的压力就是10* 3。
热点越集中的应用,效果越好。

而对于缓存击穿的情况
↓:

使用singleflight也能让同一时间大量相同的请求进行阻塞等待而只让第一个去实际执行~
singleflight的作用是非常广泛的,其他的场景咱们需要进行这样的限流都可以考虑一下这种设计的使用。了解过分布式锁的各位都知道,分布式锁主要是用来对分布式系统一致性问题的一个“并发更新”的解决。而分布式锁加上来由于锁的竞争往往会使得整个系统变得很慢,那我们完全可以考虑singleflight配合上分布式锁一起使用来减少锁竞争的压力

在单机中我们就通过singleflight来竞争出一个优胜者然后再与别的集群去竞争锁,这样我们就可以将大量的锁竞争减少为节点之间的锁竞争~
而singleflight的具体使用大家可以自行去看文档,用起来还是相对

singleflight是一个库,提供重复函数调用抑制,防止并发中多次调用同一函数。它能减少数据库压力,适用于缓存击穿场景,还可与分布式锁配合减少锁竞争。底层实现利用互斥锁、map和WaitGroup实现同步与阻塞。
最低0.47元/天 解锁文章
1060

被折叠的 条评论
为什么被折叠?



