openscrm / api-server

OpenSCRM是一套基于Go和React的高质量企业微信私域流量管理系统 。遵守Apache2.0协议,全网唯一免费商用。企业微信、私域流量、SCRM。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

这个项目如何在k8s上跑起来?

zsmhub opened this issue · comments

将这个项目部署在 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
        }
    }
}

企业微信的机制是,access_token 刷新多次,老的token依旧有效,互不影响

多实例部署需要改动:1.定时任务改为中心化的 2.gcache改为基于redis的

刷新 token 改为定时任务方向是 ok 的,毕竟 token 刷新每日次数是有限的