add interface Bitrate

pull/2/head
q191201771
parent 49086ee14b
commit b19dce7d4c

@ -13,11 +13,11 @@ import (
"time"
)
type Bitrate struct {
option Option
type Bitrate interface {
// @param nowUnixMSec: 变参,可选择从外部传入当前 unix 时间戳,单位毫秒
Add(bytes int, nowUnixMSec ...int64)
mu sync.Mutex
bucketSlice []bucket
Rate(nowUnixMSec ...int64) float32
}
type Unit uint8
@ -40,25 +40,31 @@ var defaultOption = Option{
Unit: UnitKBitPerSec,
}
type bucket struct {
n int
t int64 // unix 时间戳,单位毫秒
}
type ModOption func(option *Option)
func NewBitrate(modOptions ...ModOption) *Bitrate {
func New(modOptions ...ModOption) Bitrate {
option := defaultOption
for _, fn := range modOptions {
fn(&option)
}
return &Bitrate{
return &bitrate{
option: option,
}
}
// @param nowUnixMSec 可选择从外部传入当前 unix 时间戳,单位毫秒
func (b *Bitrate) Add(bytes int, nowUnixMSec ...int64) {
type bitrate struct {
option Option
mu sync.Mutex
bucketSlice []bucket
}
type bucket struct {
n int
t int64 // unix 时间戳,单位毫秒
}
func (b *bitrate) Add(bytes int, nowUnixMSec ...int64) {
var now int64
if len(nowUnixMSec) == 0 {
now = time.Now().UnixNano() / 1e6
@ -76,7 +82,7 @@ func (b *Bitrate) Add(bytes int, nowUnixMSec ...int64) {
})
}
func (b *Bitrate) Rate(nowUnixMSec ...int64) float32 {
func (b *bitrate) Rate(nowUnixMSec ...int64) float32 {
var now int64
if len(nowUnixMSec) == 0 {
now = time.Now().UnixNano() / 1e6
@ -107,7 +113,7 @@ func (b *Bitrate) Rate(nowUnixMSec ...int64) float32 {
return ret
}
func (b *Bitrate) sweepStale(now int64) {
func (b *bitrate) sweepStale(now int64) {
for i := range b.bucketSlice {
if now-b.bucketSlice[i].t > int64(b.option.WindowMS) {
b.bucketSlice = b.bucketSlice[1:]

@ -17,8 +17,8 @@ import (
)
func TestBitrate(t *testing.T) {
var b *bitrate.Bitrate
b = bitrate.NewBitrate(func(option *bitrate.Option) {
var b bitrate.Bitrate
b = bitrate.New(func(option *bitrate.Option) {
option.WindowMS = 10
})
b.Add(1000)
@ -36,7 +36,7 @@ func TestUnit(t *testing.T) {
bitrate.UnitKBytePerSec: 100,
}
for k, v := range golden {
b := bitrate.NewBitrate(func(option *bitrate.Option) {
b := bitrate.New(func(option *bitrate.Option) {
option.WindowMS = 10
option.Unit = k
})
@ -47,8 +47,8 @@ func TestUnit(t *testing.T) {
}
func TestOutsizeNow(t *testing.T) {
var b *bitrate.Bitrate
b = bitrate.NewBitrate(func(option *bitrate.Option) {
var b bitrate.Bitrate
b = bitrate.New(func(option *bitrate.Option) {
option.WindowMS = 10
})
now := time.Now().UnixNano() / 1e6

@ -26,8 +26,8 @@ type ConsistentHash interface {
// @return: 返回的 map 的
// key 为添加到内部的 node
// value 为该 node 在环上所占的 point 个数。
// 我们可以通过各个 node 对应的 point 个数是否接近,来观察各 node 在环上的分布是否均衡。
// map 的所有 value 加起来应该等于 math.MaxUint32 + 1
// 我们可以通过各个 node 对应的 point 个数是否接近,来判断各 node 在环上的分布是否均衡。
// map 的所有 value 加起来应该等于 (math.MaxUint32 + 1)
Nodes() map[string]uint64
}
@ -37,6 +37,10 @@ type Option struct {
hfn HashFunc
}
var defaultOption = Option{
hfn: crc32.ChecksumIEEE,
}
type ModOption func(option *Option)
// @param dups: 每个实际的 node 转变成多少个环上的节点必须大于等于1
@ -53,10 +57,6 @@ func New(dups int, modOptions ...ModOption) ConsistentHash {
}
}
var defaultOption = Option{
hfn: crc32.ChecksumIEEE,
}
type consistentHash struct {
point2node map[uint32]string
points []uint32

Loading…
Cancel
Save