Notes:
- cannot be used for multiple leaders/quorum
- races between leader updates in servers/clients should be handled by message queuing and/or retry
err := discoverd.Register("www", ":9099")
listenAndServe() // i.e. net.Listen("tcp", ":9099")
standbyCh, err := discoverd.RegisterAndStandby("sampi", ":9099", nil)
<-standbyCh
listenAndServe()
standbyCh, err := discoverd.RegisterAndStandby("mysql", ":9099", nil)
go func() {
<-standbyCh
upgradeToLeader()
}()
listenAndServe()
set, err := discoverd.ServiceSet("sampi")
for {
leader := <-set.Leader() // receives current leader and any new future leaders
go updateConnection(leader.Addr)
}
set, err := discoverd.ServiceSet("app")
for update := range set.Updates() {
if update.Online {
connectionPool.Add(update.Addr)
} else {
connectionPool.Remove(update.Addr)
}
}
rand.Seed(time.Now().UnixNano())
services, err := discoverd.Services("app", timeout)
conn, err := net.Dial("tcp", services[rand.Intn(len(services))].Addr)
services, err := discoverd.Services("app", timeout)
conn, err := net.Dial("tcp", services[0].Addr) // index 0 is always current leader at the time
Many active servers, one leader server, all servers connect to leader and are ready to become leader
set, err := discoverd.RegisterWithSet("cluster", ":9099", nil)
go func() {
for {
leader := <-set.Leader() // receives current leader and any new future leaders
if leader != nil {
go updateConnection(leader.Addr)
} else {
upgradeToLeader()
}
}
}()
listenAndServe()
discoverd.RegisterWithSet can also be used similarly in order to handle "downgrading" from leader.
Lazily creates a channel to return and sends current leader on it, unless channel exists in which case it just returns existing channel and any changes of leader will continue to be sent to it. This means, once you call set.Leader() you have to always be receiving on it until you call set.Close()
The channel this returns will receive one service when the registered service is elected leader. It assumes it will only become leader once, so after that send, it won't attempt to send again.
This returns a set from discoverd.ServiceSet() but excluding the service registered. This ensures it doesn't connect to itself. However, the set.Leader() will still fire when this service becomes leader, but since it wasn't in the set, the value will be nil, which is how it will know when it is elected leader.