/
cluster.go
67 lines (58 loc) · 1.17 KB
/
cluster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package cluster
import (
"github.com/hashicorp/memberlist"
//"io/ioutil"
"log"
"stathat.com/c/consistent"
"time"
)
type Node interface {
ShouldProcess(key string) (string, bool)
Members() []string
GetAddr() string
}
type node struct {
*consistent.Consistent
addr string
}
func (n *node) GetAddr() string {
return n.addr
}
func (n *node) ShouldProcess(key string) (string, bool) {
addr, _ := n.Get(key)
return addr, addr == n.addr
}
func New(addr, cluster string) (Node, error) {
conf := memberlist.DefaultLANConfig()
conf.Name = addr
conf.BindAddr = addr
//conf.LogOutput = ioutil.Discard
list, err := memberlist.Create(conf)
if err != nil {
return nil, err
}
if cluster == "" {
cluster = addr
}
clus := []string{cluster}
_, err = list.Join(clus)
if err != nil {
return nil, err
}
circle := consistent.New()
circle.NumberOfReplicas = 256
go func() {
for {
members := list.Members()
nodes := make([]string, len(members))
for i, n := range members {
nodes[i] = n.Name
log.Println("node :", n.Name)
}
circle.Set(nodes)
time.Sleep(time.Second * 5)
log.Println("Checking the cluster ...")
}
}()
return &node{circle, addr}, nil
}