server_picker.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package protocol
  2. import (
  3. "sync"
  4. )
  5. type ServerList struct {
  6. sync.RWMutex
  7. servers []*ServerSpec
  8. }
  9. func NewServerList() *ServerList {
  10. return &ServerList{}
  11. }
  12. func (sl *ServerList) AddServer(server *ServerSpec) {
  13. sl.Lock()
  14. defer sl.Unlock()
  15. sl.servers = append(sl.servers, server)
  16. }
  17. func (sl *ServerList) Size() uint32 {
  18. sl.RLock()
  19. defer sl.RUnlock()
  20. return uint32(len(sl.servers))
  21. }
  22. func (sl *ServerList) GetServer(idx uint32) *ServerSpec {
  23. sl.Lock()
  24. defer sl.Unlock()
  25. for {
  26. if idx >= uint32(len(sl.servers)) {
  27. return nil
  28. }
  29. server := sl.servers[idx]
  30. if !server.IsValid() {
  31. sl.removeServer(idx)
  32. continue
  33. }
  34. return server
  35. }
  36. }
  37. func (sl *ServerList) removeServer(idx uint32) {
  38. n := len(sl.servers)
  39. sl.servers[idx] = sl.servers[n-1]
  40. sl.servers = sl.servers[:n-1]
  41. }
  42. type ServerPicker interface {
  43. PickServer() *ServerSpec
  44. }
  45. type RoundRobinServerPicker struct {
  46. sync.Mutex
  47. serverlist *ServerList
  48. nextIndex uint32
  49. }
  50. func NewRoundRobinServerPicker(serverlist *ServerList) *RoundRobinServerPicker {
  51. return &RoundRobinServerPicker{
  52. serverlist: serverlist,
  53. nextIndex: 0,
  54. }
  55. }
  56. func (p *RoundRobinServerPicker) PickServer() *ServerSpec {
  57. p.Lock()
  58. defer p.Unlock()
  59. next := p.nextIndex
  60. server := p.serverlist.GetServer(next)
  61. if server == nil {
  62. next = 0
  63. server = p.serverlist.GetServer(0)
  64. }
  65. next++
  66. if next >= p.serverlist.Size() {
  67. next = 0
  68. }
  69. p.nextIndex = next
  70. return server
  71. }