...

Source file src/github.com/go-kit/kit/sd/lb/round_robin.go

Documentation: github.com/go-kit/kit/sd/lb

     1  package lb
     2  
     3  import (
     4  	"sync/atomic"
     5  
     6  	"github.com/go-kit/kit/endpoint"
     7  	"github.com/go-kit/kit/sd"
     8  )
     9  
    10  // NewRoundRobin returns a load balancer that returns services in sequence.
    11  func NewRoundRobin(s sd.Endpointer) Balancer {
    12  	return &roundRobin{
    13  		s: s,
    14  		c: 0,
    15  	}
    16  }
    17  
    18  type roundRobin struct {
    19  	s sd.Endpointer
    20  	c uint64
    21  }
    22  
    23  func (rr *roundRobin) Endpoint() (endpoint.Endpoint, error) {
    24  	endpoints, err := rr.s.Endpoints()
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	if len(endpoints) <= 0 {
    29  		return nil, ErrNoEndpoints
    30  	}
    31  	old := atomic.AddUint64(&rr.c, 1) - 1
    32  	idx := old % uint64(len(endpoints))
    33  	return endpoints[idx], nil
    34  }
    35  

View as plain text