62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package naming
|
||
|
||
import (
|
||
"sync"
|
||
|
||
"github.com/toolkits/pkg/consistent"
|
||
"github.com/toolkits/pkg/logger"
|
||
)
|
||
|
||
const NodeReplicas = 500
|
||
|
||
type ConsistentHashRing struct {
|
||
sync.RWMutex
|
||
ring *consistent.Consistent
|
||
}
|
||
|
||
// 哈希环是活着的judge实例(因为模块合并,即server实例)组成的
|
||
// trans利用哈希环做数据分片计算
|
||
// judge利用哈希环做PULL型策略分片计算
|
||
var HashRing = NewConsistentHashRing(int32(NodeReplicas), []string{})
|
||
|
||
func (chr *ConsistentHashRing) GetNode(pk string) (string, error) {
|
||
chr.RLock()
|
||
defer chr.RUnlock()
|
||
|
||
return chr.ring.Get(pk)
|
||
}
|
||
|
||
func (chr *ConsistentHashRing) Set(r *consistent.Consistent) {
|
||
chr.Lock()
|
||
defer chr.Unlock()
|
||
chr.ring = r
|
||
}
|
||
|
||
func (chr *ConsistentHashRing) GetRing() *consistent.Consistent {
|
||
chr.RLock()
|
||
defer chr.RUnlock()
|
||
|
||
return chr.ring
|
||
}
|
||
|
||
func NewConsistentHashRing(replicas int32, nodes []string) *ConsistentHashRing {
|
||
ret := &ConsistentHashRing{ring: consistent.New()}
|
||
ret.ring.NumberOfReplicas = int(replicas)
|
||
for i := 0; i < len(nodes); i++ {
|
||
ret.ring.Add(nodes[i])
|
||
}
|
||
return ret
|
||
}
|
||
|
||
func RebuildConsistentHashRing(nodes []string) {
|
||
r := consistent.New()
|
||
r.NumberOfReplicas = NodeReplicas
|
||
for i := 0; i < len(nodes); i++ {
|
||
r.Add(nodes[i])
|
||
}
|
||
|
||
HashRing.Set(r)
|
||
|
||
logger.Infof("hash ring rebuild %+v", r.Members())
|
||
}
|