hystrix go源码分析 统计控制器

hystrix里的统计器基本单位是Number,记录某个指标过去10s内的次数

	type Number struct {
	// key 值为timestamp value为次数
	Buckets map[int64]*numberBucket
	Mutex   *sync.RWMutex
}

type numberBucket struct {
	Value float64
}

简单分析两个方法,看下它是如何做到的

	// Increment increments the number in current timeBucket.
func (r *Number) Increment(i float64) {
	if i == 0 {
		return
	}

	r.Mutex.Lock()
	defer r.Mutex.Unlock()
	// 从map获取当前numberBucket ,没有则新建
	b := r.getCurrentBucket()
	b.Value += i
	// 移除过去10s以前的数据
	r.removeOldBuckets()
}

计算10s内的次数之和

func (r *Number) Sum(now time.Time) float64 {
	sum := float64(0)
	
	// 加的写锁提升效率
	r.Mutex.RLock()
	defer r.Mutex.RUnlock()

	for timestamp, bucket := range r.Buckets {
		// TODO: configurable rolling window
		if timestamp >= now.Unix()-10 {
			sum += bucket.Value
		}
	}

	return sum
}

你可能感兴趣的:(编程日记)