一些源码包的解读,帮助更好的写代码
sync.Once
关于sync once, https://geektutu.com/post/hpg-sync-once.html 这篇文章讲的很详细,代码很简洁,对于我们平时用的需要关注的就是我们每一种类型的动作,如果都想使用sync.Once, 一定要分开单独定义 once 对象
1 | // Copyright 2009 The Go Authors. All rights reserved. |
注意golang 中很多这种包都是内存型,一旦重启,变量就会被重置。对于一些只能执行一次的方法,我们还得用redis 的分布式锁。
我们用 sync.once 只是为了过滤掉大部分的重复动作的。
single flight
single flight 变量group 的定义,就需要我们全局定义了,这点一定要注意,我们不要在controller 接口里面随意定义一个这样的变量。 查看源码,核心struct 是个map, 所以我们定义的key 一定不能重复,否则可能会出现别人的结果返回。single flight 主要用来就是 防止比如单个内存过期,并发太高,相同结果的请求都打到db 上。(如果活动针对单人,一种因为设置了相同的过期时间,导致缓存同时过期(雪崩),这时候 single flight 不能解决,可以给每个缓存设置一个base 时间 + rand 时间,防止同时过期。对于运营活动,上述雪崩情况可能真的会发生!!!!
single flight 的异常处理很复杂,暂且没有仔细研读,说一下其中几个核心的知识点。
1 | // Group represents a class of work and forms a namespace in |
errgroup
这里介绍两个errgroup ,一个是原生的,另一个是 b站开源kratos 工具包中 errgroup
1 | // Copyright 2016 The Go Authors. All rights reserved. |
看下b站版本的
b站支持两个版本的errgroup ,一种是原生的,我们不要调用 GOMAXPROCS(n int) ,方法
另一种是利用缓冲channel, 实现协程数量的限制。
1 | // Copyright 2016 The Go Authors. All rights reserved. |