github.com/cloudwego/kitex@v0.9.0/pkg/loadbalance/lbcache/shared_ticker.go (about) 1 /* 2 * Copyright 2021 CloudWeGo Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package lbcache 18 19 import ( 20 "sync" 21 "time" 22 23 "golang.org/x/sync/singleflight" 24 25 "github.com/cloudwego/kitex/pkg/utils" 26 ) 27 28 var ( 29 // insert, not delete 30 sharedTickers sync.Map 31 sharedTickersSfg singleflight.Group 32 ) 33 34 func getSharedTicker(b *Balancer, refreshInterval time.Duration) *utils.SharedTicker { 35 sti, ok := sharedTickers.Load(refreshInterval) 36 if ok { 37 st := sti.(*utils.SharedTicker) 38 st.Add(b) 39 return st 40 } 41 v, _, _ := sharedTickersSfg.Do(refreshInterval.String(), func() (interface{}, error) { 42 st := utils.NewSharedTicker(refreshInterval) 43 sharedTickers.Store(refreshInterval, st) 44 return st, nil 45 }) 46 st := v.(*utils.SharedTicker) 47 // Add without singleflight, 48 // because we need all refreshers those call this function to add themselves to SharedTicker 49 st.Add(b) 50 return st 51 }