这个项目如何在k8s上跑起来?
zsmhub opened this issue · comments
Michael commented
将这个项目部署在 k8s 上,分配 3 个副本,如何保证只有 1 个副本在刷新 access_token ?
看了下源代码,是直接开一个协程在刷新 access_token,但是项目部署在 3 个副本时,每个副本都会启动刷新 access_token 的协程,那就意味着每个副本都在刷新 access_token?
func (t *Token) tokenRefresher(ctx context.Context) {
// refresh per 30m
const refreshTimeWindow = (2*60 - 30) * time.Minute
const minRefreshDuration = 5 * time.Second
var nextRefreshDuration time.Duration = 0
for {
select {
case <-time.After(nextRefreshDuration):
retryer := backoff.WithContext(backoff.NewExponentialBackOff(), ctx)
if err := backoff.Retry(t.syncToken, retryer); err != nil {
log.Println("retry getting access token failed", "err", err)
_ = err
}
nextRefreshDuration = t.LastRefresh.Add(t.ExpiresIn - refreshTimeWindow).Sub(t.LastRefresh)
if nextRefreshDuration < minRefreshDuration {
nextRefreshDuration = minRefreshDuration
}
case <-ctx.Done():
return
}
}
}
GargantuaX commented
企业微信的机制是,access_token 刷新多次,老的token依旧有效,互不影响
GargantuaX commented
多实例部署需要改动:1.定时任务改为中心化的 2.gcache改为基于redis的
Michael commented
刷新 token 改为定时任务方向是 ok 的,毕竟 token 刷新每日次数是有限的